for - ¿Cómo puedo definir funciones nombradas en la consola Elixir sin obtener**(ArgumentError) no puedo invocar def/2 módulo externo?
list max elixir (2)
Podrías definir el módulo en iex. Copiar y pegar funciona bien:
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
Puedo definir funciones nombradas en módulos muy bien, pero todavía no tengo el truco para usar en las consolas iex> o ex>.
Sigo recibiendo el siguiente error cuando intento ejecutar el comando 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)
Puedo ejecutar esto con elixir muy bien, de la siguiente manera:
$ elixir pprime.exs
Sin embargo, en la consola, parece que no puedo hacer nada de eso:
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
¿Cómo puedo definir una función nombrada en la consola Elixir?
¿Es esto posible?
¿Necesito crear un módulo especial para usar en la consola Elixir?
Respuesta corta: No puedes.
Respuesta larga: todo el código en Elixir existe dentro de los módulos, ya que muchas características de Elixir, como el intercambio de código en caliente, se basan en tener módulos como contenedor de código. Es por eso que no puede definir funciones fuera de los módulos (no se puede agregar un espacio de nombres global y mutable).