Как определить именованные функции в консоли Elixir, не получая ** (ArgumentError), не может вызвать def/2 вне модуля?
Я могу точно определить именованные функции в модулях, но я еще не освоил их для использования в консолях iex> или ex>.
Я продолжаю получать следующую ошибку при попытке запустить команду def:
(ArgumentError) cannot invoke def/2 outside module
pprime.exs
IO.puts "initial division test"
defmodule Expand do
def transform(myvar) do
8 * myvar + 3;
end
end
div2 = fn inputnum ->
[:a, inputnum/2.0, inputnum/3, inputnum/5.0, inputnum/7]
end
output = div2.(20.1)
Я могу запустить это с эликсиром очень хорошо, как показано ниже:
$ elixir pprime.exs
Тем не менее, в консоли я не могу сделать что-то подобное:
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [async-threads:10] [kernel-poll:false]
Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> def transform(myvar) do 8 * myvar + 3; end
** (ArgumentError) cannot invoke def/2 outside module
(elixir) lib/kernel.ex:3556: Kernel.assert_module_scope/3
(elixir) lib/kernel.ex:2816: Kernel.define/4
(elixir) expanding macro: Kernel.def/2
(elixir) iex:1: :elixir_compiler.__FILE__/2
Как определить именованную функцию в консоли Elixir?
Это вообще возможно?
Нужно ли создавать специальный модуль для использования в консоли Elixir?
2 ответа
Краткий ответ: вы не можете.
Длинный ответ: весь код в Elixir существует внутри модулей, так как многие функции Elixir, такие как горячая замена кода, зависят от наличия модулей в качестве контейнера кода. Вот почему вы не можете определять функции вне модулей (нет глобального, изменяемого пространства имен, в которое они могли бы быть добавлены).
Вы можете определить модуль в iex. Копирование и вставка работает просто отлично:
iex(1)> defmodule Expand do
...(1)> def transform(myvar) do
...(1)> 8 * myvar + 3;
...(1)> end
...(1)> end
iex(2)> Expand.transform(12)
99
iex(3)> defmodule Expand do
...(3)> def transform(myvar) do
...(3)> 3 * myvar + 5
...(3)> end
...(3)> end
iex:3: warning: redefining module Expand
iex(4)> Expand.transform(12)
41