扩展@zwippie 所写的内容:
所有远程函数调用(我的意思是调用具有显式设置模块/别名的函数)的形式为:
<atom with module name>.<function name>(<arguments>)
# Technically it is the same as:
# apply(module, function_name_as_atom, [arguments])
而 Elixir 中的所有“大写模块名称”都只是原子:
is_atom(Foo) == true
Foo == :"Elixir.Foo" # => true
所以从 Elixir 的角度来看,调用 Erlang 函数和 Elixir 函数没有区别。它只是作为接收模块传递的不同原子。
因此您可以轻松地从 Elixir 调用 Erlang 模块。这意味着您应该也可以在 Elixir 中轻松编译 Erlang AST:
"rand:uniform(100)"
|> :merl.quote()
|> :erl_eval.expr(#{})
不需要任何心理翻译。
此外,您可以毫无问题地在单个 Mix 项目中混合 Erlang 和 Elixir 代码。树形结构如下:
.
|`- mix.exs
|`- src
| `- example.erl
`- lib
`- example.ex
example.erl 在哪里:
-module(example).
-export([hello/0]).
hello() -> <<"World">>.
还有example.ex:
defmodule Example do
def print_hello, do: IO.puts(:example.hello())
end
你可以编译项目并运行它
mix run -e "Example.print_hello()"
并且看到 Erlang 模块在同一个项目的 Elixir 代码中成功编译和执行,没有问题。