我正在尝试在Erlang模块中使用从Elixir源编译的beam文件。当我运行Erlang节点时它会引发错误,但我可以直接使用Elixir中的代码。
Elixir模块:
defmodule Recursion do
def print_multiple_times(msg, n) when n <= 1 do
IO.puts msg
end
def print_multiple_times(msg, n) do
IO.puts msg
print_multiple_times(msg, n - 1)
end
end
Erlang模块:
-module(use_recur).
-define(elixir__recursion, 'Elixir.Recursion').
-export([hey/0]).
hey() ->
?elixir__recursion:print_multiple_times("Hello!", 3).
编译两者:
$ rm -f * .beam $ elixirc recursion.ex
$ erlc use_recur.erl
运行Erlang:
$ erl -run use_recur hey -run init stop -noshell {&#34; init终止于do_boot&#34;,{undef,[{&#39; Elixir.IO&#39;,puts,[&#34 ;你好&#34;!],[]},{&#39; Elixir.Recursion&#39;,print_multiple_times,2,[{文件,&#34; recursion.ex&#34;},{线,7} ]},{INIT,start_em,1,[]},{INIT,do_boot,3,[]}]}} init终止于do_boot({undef,[{Elixir.IO,puts,Hello!,[]},{Elixir.Recursion,print_multiple_times,2,[{},{}]},{init ,start_em,1,[]},{INIT,do_boot,3,[]}]})
崩溃转储正在写入:erl_crash.dump ...已完成
Elixir脚本:
Recursion.print_multiple_times "Hello!", 3
成功运行:
$ elixir elx_recur.exs
Hello!
Hello!
Hello!
为什么会这样?我说Erlang的输出应该是一样的。
答案 0 :(得分:3)
错误意味着Erlang无法找到名为'Elixir.IO'
的模块。该模块是核心Elixir的一部分。您需要使用ebin
(或其他类似的标记,如-pa
)将Elixir安装的-pz
文件夹添加到Erlang的加载路径中,以使Erlang加载Elixir的核心库,作为该文件夹包含Elixir核心的已编译.beam
文件,包括Elixir.IO.beam
。
erl -pa /path/to/elixir/ebin ...