valim tutorial sinonimo lenguaje just josé framework erlang elixir

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)"

Puedes ver la salida similar a la foto: