tutorial - ¿Cómo ejecuto un archivo de viga compilado por Elixir o Erlang?
josé valim (3)
Para abordar específicamente la pregunta:
$ elixirc test.ex
producirá un archivo llamado Elixir.Hello.beam
, si el archivo define un módulo Hello
.
Si ejecuta elixir
o iex
desde el directorio que contiene este archivo, el módulo estará disponible. Asi que:
$ elixir -e Hello.some_function
o
$ iex
iex(1)> Hello.some_function
Instalé Erlang / OTP y Elixir, y compilé el programa HelloWorld en un BEAM usando el comando:
elixirc test.ex
Lo que produjo un archivo llamado Elixir.Hello.beam
¿Cómo ejecuto este archivo?
Respuesta corta: no hay forma de saberlo con seguridad sin saber también el contenido de su archivo fuente :)
Hay algunas formas de ejecutar el código de Elixir. Esta respuesta será una descripción general de varios flujos de trabajo que se pueden usar con Elixir.
Cuando está empezando y quiere probar cosas, lanzar el iex
y evaluar las expresiones de una en una es el camino a seguir.
iex(5)> Enum.reverse [1,2,3,4]
[4, 3, 2, 1]
También puede obtener ayuda sobre los módulos y funciones de Elixir en iex
. La mayoría de las funciones tienen ejemplos en sus documentos.
iex(6)> h Enum.reverse
def reverse(collection)
Reverses the collection.
[...]
Cuando quiera poner algo de código en un archivo para reutilizarlo más tarde, la forma recomendada (y estándar de facto) es crear un proyecto mixto y comenzar a agregarle módulos. Pero tal vez, le gustaría saber qué sucede debajo de las coberturas antes de confiar en la mezcla para realizar tareas comunes como compilar código, iniciar aplicaciones, etc. Déjame explicarte eso.
La forma más sencilla de poner algunas expresiones en un archivo y ejecutarlo sería usar el comando elixir
.
x = :math.sqrt(1234)
IO.puts "Your square root is #{x}"
Coloque el fragmento de código anterior en un archivo llamado simple.exs
y ejecútelo con elixir simple.exs
. La extensión .exs
es solo una convención para indicar que el archivo debe evaluarse (y eso es lo que hicimos).
Esto funciona hasta el punto en el que desea comenzar a construir un proyecto. Entonces necesitarás organizar tu código en módulos. Cada módulo es una colección de funciones. También es la unidad de compilación mínima: cada módulo se compila en un archivo .beam
. Por lo general, las personas tienen un módulo por archivo fuente, pero también está bien definir más de uno. Independientemente de la cantidad de módulos en un solo archivo fuente, cada módulo terminará en su propio archivo .beam
cuando se compile.
defmodule M do
def hi(name) do
IO.puts "Hello, #{name}"
end
end
Hemos definido un módulo con una sola función. mymod.ex
un archivo llamado mymod.ex
. Podemos usarlo de múltiples maneras:
ejecute
iex
y evalúe el código en la sesión de shell generada:$ iex mymod.ex iex> M.hi "Alex" Hello, Alex :ok
Evalúalo antes de ejecutar algún otro código. Por ejemplo, para evaluar una sola expresión en la línea de comandos, use
elixir -e <expr>
. Puede "requerir" (básicamente, evaluar y cargar) uno o más archivos antes de que:$ elixir -r mymod.ex -e ''M.hi "Alex"'' Hello, Alex
compílelo y deje que la facilidad de carga de códigos de la máquina virtual lo encuentre
$ elixirc mymod.ex $ iex iex> M.hi "Alex" Hello, Alex :ok
En ese último ejemplo Elixir.M.beam
el módulo que produjo un archivo llamado Elixir.M.beam
en el directorio actual. Cuando ejecuta iex
en el mismo directorio, el módulo se cargará la primera vez que se llame a una función. También puede utilizar otras formas de evaluar el código, como el elixir -e ''M.hi "..."''
. Siempre que el cargador de código pueda encontrar el archivo .beam
, el módulo se cargará y se ejecutará la función correspondiente.
Sin embargo, se trataba de jugar con algunos ejemplos de código. Cuando esté listo para construir un proyecto en Elixir, necesitará usar mix
. El flujo de trabajo con la mix
es más o menos como sigue:
$ mix new myproj
* creating README.md
* creating .gitignore
* creating mix.exs
[...]
$ cd myproj
# ''mix new'' has generated a dummy test for you
# see test/myproj_test.exs
$ mix test
Agregar nuevos módulos en el directorio lib/
. Es habitual prefijar todos los nombres de módulos con el nombre de su proyecto. Entonces, si toma el módulo M
que definimos anteriormente y lo puso en el archivo lib/m.ex
, se verá así:
defmodule Myproj.M do
def hi(name) do
IO.puts "Hello, #{name}"
end
end
Ahora puedes iniciar un shell con el proyecto Mix cargado.
$ iex -S mix
Ejecutar lo anterior compilará todo su archivo fuente y los colocará en el directorio _build
. Mix también configurará la ruta del código para que el cargador de código pueda localizar los archivos .beam
en ese directorio.
La evaluación de expresiones en el contexto de un proyecto mix se ve así:
$ mix run -e ''Myproj.M.hi "..."''
De nuevo, no hace falta compilar nada. La mayoría de las tareas mixtas recompilarán los archivos modificados, por lo que puede asumir con seguridad que cualquier módulo que haya definido estará disponible cuando llame a las funciones desde ellos.
Ejecute la mix help
para ver todas las tareas disponibles y la mix help <task>
para obtener una descripción detallada de una tarea en particular.
Supongamos que escribo un programa de Elixir como este:
defmodule PascalTriangle do
defp next_row(m), do: for(x <- (-1..Map.size(m)-1), do: { (x+1), Map.get(m, x, 0) + Map.get(m, x+1, 0) } ) |> Map.new
def draw(1), do: (IO.puts(1); %{ 0 => 1})
def draw(n) do
(new_map = draw(n - 1) |> next_row ) |> Map.values |> Enum.join(" ") |> IO.puts
new_map
end
end
El módulo PascalTriangle se puede usar así: PascalTriangle.draw(8)
Cuando use elixirc
para compilar el archivo ex, se creará un archivo llamado Elixir.PascalTriangle.beam .
Desde la línea de comandos, puede ejecutar el archivo de haz como este: elixir -e "PascalTriangle.draw(8)"