Подтвердить что ты не робот

Как запустить файл луча, скомпилированный Elixir или Erlang?

Я установил Erlang/OTP и Elixir и скомпилировал программу HelloWorld в BEAM с помощью команды:

elixirc test.ex

Создал файл с именем Elixir.Hello.beam

Как запустить этот файл?

4b9b3361

Ответ 1

Короткий ответ: вы не можете точно знать, не зная содержимого исходного файла:)

Существует несколько способов запуска кода Elixir. Этот ответ будет обзором различных рабочих процессов, которые могут использоваться с Elixir.

Когда вы только начинаете и хотите попробовать, запуск iex и оценка выражений по одному - это путь.

iex(5)> Enum.reverse [1,2,3,4]
[4, 3, 2, 1]

Вы также можете получить помощь по модулям и функциям Elixir в iex. Большинство функций имеют примеры в своих документах.

iex(6)> h Enum.reverse

                        def reverse(collection)

Reverses the collection.
[...]

Если вы хотите поместить некоторый код в файл, чтобы повторно использовать его позже, рекомендуемый (и де-факто стандартный) способ - создать проект микширования и начать добавлять к нему модули. Но, возможно, вы хотели бы знать, что происходит под обложками, прежде чем полагаться на микс, чтобы выполнять общие задачи, такие как компиляция кода, запуск приложений и т.д. Позвольте мне объяснить это.

Самый простой способ поместить некоторые выражения в файл и запустить его - это использовать команду elixir.

x = :math.sqrt(1234)
IO.puts "Your square root is #{x}"

Поместите вышеуказанный фрагмент кода в файл с именем simple.exs и запустите его с помощью elixir simple.exs. Расширение .exs - это просто соглашение, указывающее, что файл предназначен для оценки (и это то, что мы сделали).

Это работает до тех пор, пока вы не захотите начать проект. Затем вам нужно будет организовать свой код в модули. Каждый модуль представляет собой набор функций. Это также минимальная единица компиляции: каждый модуль скомпилирован в файл .beam. Обычно у людей есть один модуль для исходного файла, но также можно определить более одного. Независимо от количества модулей в одном исходном файле, каждый модуль будет скомпилирован в своем собственном файле .beam.

defmodule M do
  def hi(name) do
    IO.puts "Hello, #{name}"
  end
end

Мы определили модуль с одной функцией. Сохраните его в файл с именем mymod.ex. Мы можем использовать его несколькими способами:

  • запустите iex и оцените код в сеансе порожденной оболочки:

    $ iex mymod.ex
    
    iex> M.hi "Alex"
    Hello, Alex
    :ok
    
  • оцените его перед запуском другого кода. Например, чтобы оценить одно выражение в командной строке, используйте elixir -e <expr>. Вы можете "потребовать" (в основном, оценивать и загружать) один или несколько файлов перед ним:

    $ elixir -r mymod.ex -e 'M.hi "Alex"'
    Hello, Alex
    
  • скомпилируйте его и пусть средство загрузки кода VM найдет его

    $ elixirc mymod.ex
    $ iex
    iex> M.hi "Alex"
    Hello, Alex
    :ok
    

В этом последнем примере мы скомпилировали модуль, который создал файл с именем Elixir.M.beam в текущем каталоге. Когда вы затем запустите iex в том же каталоге, модуль будет загружен при первом вызове функции из него. Вы также можете использовать другие способы оценки кода, например elixir -e 'M.hi "..."'. Пока файл .beam может быть найден загрузчиком кода, модуль будет загружен и соответствующая функция в нем будет выполнена.


Однако все это было связано с попыткой воспроизвести некоторые примеры кода. Когда вы будете готовы к созданию проекта в Elixir, вам нужно будет использовать mix. Рабочий процесс с mix более или менее выглядит следующим образом:

$ 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

Добавьте новые модули в каталог lib/. Приоритетным является префикс всех имен модулей с вашим именем проекта. Поэтому, если вы возьмете модуль M, который мы определили выше, и поместим его в файл lib/m.ex, он будет выглядеть так:

 defmodule Myproj.M do
   def hi(name) do
     IO.puts "Hello, #{name}"
   end
 end

Теперь вы можете запустить оболочку с загруженным в нее проектом Mix.

 $ iex -S mix

Запуск выше будет скомпилировать весь ваш исходный файл и поместить их в каталог _build. Mix также установит для вас путь кода, чтобы загрузчик кода мог находить .beam файлы в этом каталоге.

Оценка выражений в контексте проекта смешивания выглядит следующим образом:

$ mix run -e 'Myproj.M.hi "..."'

Опять же, не нужно ничего компилировать. Большинство задач смешивания будут перекомпилировать любые измененные файлы, поэтому вы можете с уверенностью предположить, что любые модули, которые вы определили, доступны, когда вы вызываете из них функции.

Запустите mix help, чтобы просмотреть все доступные задачи и mix help <task>, чтобы получить подробное описание конкретной задачи.

Ответ 2

Чтобы конкретно задать вопрос:

$ elixirc test.ex

создаст файл с именем Elixir.Hello.beam, если файл определяет модуль Hello.

Если вы запустите elixir или iex из каталога, содержащего этот файл, модуль будет доступен. Итак:

$ elixir -e Hello.some_function

или

$ iex

iex(1)> Hello.some_function

Ответ 3

Предположим, что я пишу программу Elixir следующим образом:

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

Модуль PascalTriangle можно использовать следующим образом: PascalTriangle.draw(8)

Когда вы используете elixirc для компиляции ex файла, он создаст файл с именем Elixir.PascalTriangle.beam.

Из командной строки вы можете выполнить файл луча следующим образом: elixir -e "PascalTriangle.draw(8)"

Вы можете увидеть результат, похожий на фотографию: введите описание изображения здесь