Comment exécuter un fichier beam compilé par Elixir ou Erlang?
3 réponses
brève réponse: aucun moyen de savoir avec certitude Sans aussi connaître le contenu de votre fichier source:)
il y a plusieurs façons d'exécuter le code élixir. Cette réponse donnera un aperçu des différents flux de travail pouvant être utilisés avec Elixir.
quand vous venez de commencer et que vous voulez essayer des choses, lancer iex
et l'évaluation des expressions une à la fois est la voie à suivre.
iex(5)> Enum.reverse [1,2,3,4]
[4, 3, 2, 1]
vous pouvez également obtenir de l'aide sur les modules et les fonctions Elixir iex
. La plupart des fonctions ont des exemples dans leurs docs.
iex(6)> h Enum.reverse
def reverse(collection)
Reverses the collection.
[...]
lorsque vous voulez mettre du code dans un fichier pour le réutiliser plus tard, la méthode recommandée (et de facto standard) est de créer un projet mix et de commencer à y ajouter des modules. Mais peut-être, vous aimeriez savoir ce qui se passe sous les couvertures avant de compter sur mix pour effectuer des tâches communes comme la compilation de code, le démarrage des applications, et ainsi de suite. Laissez-moi expliquer que.
Le plus simple moyen de mettre certaines expressions dans un fichier et de l'exécuter, il serait d'utiliser le elixir
la commande.
x = :math.sqrt(1234)
IO.puts "Your square root is #{x}"
mettez le fragment de code ci-dessus dans un fichier nommé simple.exs
et l'exécuter avec elixir simple.exs
. .exs
extension est juste une convention pour indiquer que le fichier est destiné à être évalué (et c'est ce que nous avons fait).
cela fonctionne jusqu'au point où vous voulez commencer à construire un projet. Ensuite, vous devrez organiser votre code en modules. Chaque module est une collection des fonctions. C'est aussi l'Unité de compilation minimale: chaque module est compilé dans un .beam
fichier. Habituellement, les gens ont un module par fichier source, mais il est aussi bien d'en définir plus d'un. Quel que soit le nombre de modules dans un fichier source unique, chaque module finira dans son propre .beam
le fichier lors de la compilation.
defmodule M do
def hi(name) do
IO.puts "Hello, #{name}"
end
end
Nous avons défini un module avec une seule fonction. L'enregistrer dans un fichier nommé mymod.ex
. Nous pouvons l'utiliser en plusieurs façons:
lancer
iex
et évaluer le code dans la session de la coquille frayée:$ iex mymod.ex iex> M.hi "Alex" Hello, Alex :ok
l'évaluer avant d'exécuter un autre code. Par exemple, pour évaluer une expression unique sur la ligne de commande, utilisez
elixir -e <expr>
. Vous pouvez "requérir" (en gros, évaluer et charger) un ou plusieurs fichiers avant:$ elixir -r mymod.ex -e 'M.hi "Alex"' Hello, Alex
compilez - le et laissez l'installation de chargement de code de la VM trouver
$ elixirc mymod.ex $ iex iex> M.hi "Alex" Hello, Alex :ok
Dans ce dernier exemple, nous avons compilé le module qui produit un fichier nommé Elixir.M.beam
dans le répertoire courant. Lorsque vous exécutez ensuite iex
dans le même répertoire, le module sera chargé de la première fois qu'une fonction est appelée. Vous pouvez également utiliser d'autres moyens pour évaluer le code, comme elixir -e 'M.hi "..."'
. Tant que l' .beam
fichier peut être trouvé par le code du chargeur, le module sera chargé et la fonction appropriée, il sera exécuter.
cependant, il s'agissait d'essayer de jouer avec des exemples de code. Lorsque vous êtes prêt à construire un projet en Élixir, vous aurez besoin d'utiliser mix
. Le flux de travail avec mix
est plus ou moins comme suit:
$ 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
Ajouter de nouveaux modules dans le lib/
répertoire. Il est d'usage de préfixer tous les noms de modules avec le nom de votre projet. Donc, si vous prenez le M
module que nous avons défini ci-dessus et mis dans le fichier lib/m.ex
, il ressemblera à ceci:
defmodule Myproj.M do
def hi(name) do
IO.puts "Hello, #{name}"
end
end
Maintenant vous pouvez démarrer un shell avec le Mix project chargé dedans.
$ iex -S mix
L'exécution de ce qui précède compilera tout votre fichier source et les placera sous le _build
répertoire. Mix va également configurer le chemin de code pour vous afin que le chargeur de code puisse localiser .beam
les fichiers dans ce répertoire.
Évaluer les expressions dans le contexte d'un mélange projet ressemble à ceci:
$ mix run -e 'Myproj.M.hi "..."'
Encore une fois, pas besoin de compiler quoi que ce soit. La plupart des tâches de mix vont recompiler les fichiers modifiés, de sorte que vous pouvez en toute sécurité supposer que les modules que vous avez définis sont disponibles lorsque vous appelez des fonctions à partir de ceux-ci.
Exécuter mix help
voir toutes les tâches disponibles et mix help <task>
pour obtenir une description détaillée d'une tâche particulière.
Pour répondre spécifiquement à la question:
$ elixirc test.ex
produira un fichier nommé Elixir.Hello.beam
si le fichier définit un Hello
module.
si vous courez elixir
ou iex
dans le répertoire contenant ce fichier, le module sera disponible. Donc:
$ elixir -e Hello.some_function
ou
$ iex
iex(1)> Hello.some_function
supposons que j'écrive un programme Elixir comme ceci:
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
le module PascalTriangle peut être utilisé comme ceci:PascalTriangle.draw(8)
quand vous utilisez elixirc
pour compiler le fichier ex, il va créer un fichier appelé Élixir.PascalTriangle.faisceau.
à partir de la ligne de commande, vous pouvez exécuter le fichier beam comme ceci:
elixir -e "PascalTriangle.draw(8)"