chrisdel101

chrisdel101

Calling function from within same module it's declared is undefined/is not available

Redoing this to be more clear:

Question

How can I call a function inside a module?

File: test.exs

defmodule MyModule do

  def sum(a, b) do
    a + b
  end

  MyModule.sum(1,1) # or sum(1,1)
end

elixir test.exs :

** (UndefinedFunctionError) function MyModule.sum2/2 is undefined (function not available)
    MyModule.sum2(1, 1)

==================================================
This section can be skipped
Original question asking same thing but more confused:
This is an .exs file used for Phoenix migrations, so it’s inside the folder /priv/repo/migrations. (In case that matters). I wrote a function but it’s totally blocked. I don’t want to import it from another module since this is where it goes (declared and used in same module)


defmodule MyApp.Repo.Migrations.MyModule do
  use Ecto.Migration

  def sum1(a, b) do #public
    a + b
  end
 defp sum2(a, b) do #private
    a + b
  end

end

From iex -S mix

iex(2)> MyApp.Repo.Migrations.MyModule
MyApp.Repo.Migrations.MyModule
iex(3)> MyApp.Repo.Migrations.MyModule.sum2
** (UndefinedFunctionError) function MyApp.Repo.Migrations.MyModule.sum2/0 is undefined (module MyApp.Repo.Migrations.MyModule is not available)
    MyApp.Repo.Migrations.MyModule.sum2()

iex(4)> MyApp.Repo.Migrations.MyModule.sum1(1,1)
** (UndefinedFunctionError) function MyApp.Repo.Migrations.MyModule.sum1/2 is undefined (module MyApp.Repo.Migrations.MyModule is not available)
    MyApp.Repo.Migrations.MyModule.sum1(1, 1)
    iex:4: (file)

If U can’t call it like this, this is what I want to do. It gives the same error as the above attempt.

defmodule MyApp.Repo.Migrations.MyModule do
  use Ecto.Migration

  def sum1(a, b) do
    a + b
  end
 defp sum2(a, b) do
    a + b
  end
IO.puts(sum1(1,1)) #or sum2(1,1)
end

Pls Ignore it being bad practice (if it is) to have a function in a migration file, unless this the cause.

Real use case (Not sure if this link is accessible to all?)

Most Liked

gregvaughn

gregvaughn

In iex you have not loaded the migration module. You’ve just defined the module name as an atom. Since it’s a .exs instead of .ex it is not compiled and loaded automatically with iex -S mix

dimitarvp

dimitarvp

Replace this with:

defmodule MyModule do
  def sum(a, b) do
    a + b
  end
end

MyModule.sum(1,1)

Namely call it outside of the module, not inside of it. When you are trying to run code inside the module body – but NOT inside a function body – then you are effectively trying to run code that wasn’t compiled yet (if I remember correctly).

So if your goal is to define a module with functions and then immediately call them, my above code is a good way to do it.

Where Next?

Popular in Questions Top

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
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
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
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
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement