Comment exécuter un fichier beam compilé par Elixir ou Erlang?

j'ai installé Erlang / OTP et Elixir, et compilé le programme HelloWorld dans un faisceau en utilisant la commande:

elixirc test.ex

qui a produit un fichier nommé Elixir.Bonjour.faisceau

Comment puis-je lancer ce fichier?

23
demandé sur Peter O. 2014-08-21 01:01:37

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.

35
répondu Alexei Sholik 2014-08-20 22:27:15

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
9
répondu Henrik N 2015-07-17 22:50:58

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

Vous pouvez voir la sortie similaire à la photo: enter image description here

4
répondu Châu Hồng Lĩnh 2016-11-17 07:10:49