Я установил Erlang/OTP и Elixir и скомпилировал программу HelloWorld в BEAM с помощью команды:
elixirc test.ex
Создал файл с именем Elixir.Hello.beam
Как запустить этот файл?
Я установил Erlang/OTP и Elixir и скомпилировал программу HelloWorld в BEAM с помощью команды:
elixirc test.ex
Создал файл с именем Elixir.Hello.beam
Как запустить этот файл?
Короткий ответ: вы не можете точно знать, не зная содержимого исходного файла:)
Существует несколько способов запуска кода 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>
, чтобы получить подробное описание конкретной задачи.
Чтобы конкретно задать вопрос:
$ elixirc test.ex
создаст файл с именем Elixir.Hello.beam
, если файл определяет модуль Hello
.
Если вы запустите elixir
или iex
из каталога, содержащего этот файл, модуль будет доступен. Итак:
$ elixir -e Hello.some_function
или
$ iex
iex(1)> Hello.some_function
Предположим, что я пишу программу 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)"