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

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
makeitrein
Hey all, just started picking up Elixir last week and am writing a scraper as a learning project. Baby step #1 is extracting the number ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> someth...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
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

Other popular topics Top

srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 49522 488
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
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
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

We're in Beta

About us Mission Statement