rajagennu

rajagennu

Anonymous recursive functions, getting error: warning: variable "fibonaci" does not exist

Hello,

I am testing below code

fibonaci = fn
  0 -> 0
  1 -> 1
   n -> fibonaci.(n-1) + fibonaic.(n-2)
end

IO.puts fibonaci.(10)

I am getting error as

elixir fibonaci.ex
warning: variable "fibonaci" does not exist and is being expanded to "fibonaci()", please use parentheses to remove the ambiguity or change the variable name
  fibonaci.ex:4

** (CompileError) fibonaci.ex:4: undefined function fibonaci/0 (there is no such import)

Please help, Thank you.

Marked As Solved

ds604

ds604

I wanted to be able to do this too, since sometimes I don’t want a whole module just to test a function. I found somewhere someone showed to do it like this:

fib = fn
  1, _ -> 1
  2, _ -> 1
  n, recur -> recur.(n - 1, recur) + recur.(n - 2, recur)
end

fib.(10, fib) |> IO.puts()

Put recur (or whatever stand-in name you want) within the function, to stand for the name of the function. Then when you call the function, pass the name to itself.

======================
Notes:
(I’m trying to take some notes as I go about learning, so just putting this here so I can find it) This ergonomic issue seems relevant to individuals who arrive at Elixir through the path of Livebooks, since it suggests the use case of software development over interactive computing. Building up functionality bit by bit with little functions would be the natural path in an exploratory environment. So having to reach for a module this early on, or otherwise having to understand this slightly arcane syntax, might put off people who are looking for simple, straightforward things to be simple and straightforward, or are translating from another language.

  • Present as-is, without the need to explain y combinator
  • Livebook having an optional module wrapper might allow the style of writing plain functions
  • Rosetta code-style translator

Also Liked

NobbZ

NobbZ

The best thing you can do, is to use 2 variables:

fib_ = fn
  0, f -> 0
  1, f -> 1
  n, f -> f.(n-1) + f.(n-2)
end

fib = fn(n) -> fib_(n, fib_) end

IO.puts fib.(10)

Please beware the autocorrection.

hauleth

hauleth

If you feel adventurous then you can check out my small macro that I have created for this purpose:

defmodule Foo do
  defmacro fn_rec(do: body) do
    {name, argc, body} =
      body
      |> Enum.map(fn
        {:'->', e1, [[{:when, e2, [{name, _, args}, guard]}], body]} ->
          {name, length(args), {:'->', e1, [[{:when, e2, args ++ [guard]}], body]}}

        {:'->', e1, [[{name, _, args}], body]} ->
          {name, length(args), {:'->', e1, [args, body]}}
      end)
      |> Enum.reduce(fn {name, argc, body}, {name, argc, acc} ->
        {name, argc, List.wrap(acc) ++ [body]}
      end)

    args = Macro.generate_arguments(argc, __CALLER__.module)
    func = {:fn, [], body}
    name = {name, [], Elixir}

    quote do
      tmp =
        fn f ->
          var!(unquote(name)) = fn unquote_splicing(args) -> f.(f).(unquote_splicing(args)) end
          unquote(func)
        end

      tmp.(tmp)
    end
  end

  def run do
    ack =
      fn_rec do
        a(0, n) -> n + 1
        a(m, 0) -> a.(m - 1, 1)
        a(m, n) -> a.(m - 1, a.(m, n - 1))
      end

    ack.(3, 4)
  end
end

IO.puts Foo.run
LostKobrakai

LostKobrakai

Elixir doesn‘t have recursive anonymous functions.

Where Next?

Popular in Questions Top

Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
pgiesin
This should be a simple problem but I just can’t seem to figure it out. I have a standalone Elixir app that won’t find the database. Dep...
New
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
Phillipp
Hey, I have a NanoPi-M3 and try to install Elixir on their Ubuntu image. I followed the Raspberry Pi installation instructions from the ...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 45766 226
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
AstonJ
by Lance Halvorsen Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
460 27162 124
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
magnetic
Hey :wave:t3: Elixir community, I’ve been learning Elixir, and working on some side projects. My editor of choice is VSCode, and althoug...
New

We're in Beta

About us Mission Statement