Erlang源代码是否可以嵌入Elixir代码中?如果可以该如何实现?
Elixir与Erlang互操作及运行时执行Erlang代码说明
你的认知存在偏差,Elixir不仅原生支持和Erlang的无缝互操作,也完全支持运行时注入执行Erlang代码,相关特性比Scala与Java的互操作更加顺滑无额外开销。
基础互操作方式
Elixir和Erlang都编译为BEAM字节码运行在同一虚拟机上,类型系统、运行时完全共通,所有Erlang标准库及第三方Erlang模块都可以直接在Elixir中调用,无需任何额外转换:
- Erlang模块在Elixir中以原子形式调用,函数名也直接使用对应原子即可,比如调用Erlang的
lists模块的排序函数写法如下:
sorted = :lists.sort([3, 1, 4, 2]) # 执行结果为 [1, 2, 3, 4]
- 各类Erlang运行时特性,比如ETS、进程消息、OTP组件等都可以直接在Elixir代码中调用使用,这是Elixir的基础语法特性,日常开发中会高频使用。
运行时注入执行Erlang代码的实现
你提到的运行时动态执行代码的需求,有两种常用实现方式:
- 直接在
Code.eval_string/3中书写Elixir风格的Erlang调用语法,即可动态执行对应的Erlang逻辑:
{res, _} = Code.eval_string(":lists.sum([1, 2, 3])") # 执行结果res为6
- 如果需要直接执行原生Erlang语法的代码字符串,可以直接调用Erlang标准库的解析求值组件实现:
# 原生Erlang格式的代码字符串 erlang_code = 'lists:sum([1, 2, 3]).' # 扫描、解析、求值全流程调用Erlang标准库完成 {:ok, tokens, _} = :erl_scan.string(erlang_code) {:ok, [ast]} = :erl_parse.parse_exprs(tokens) {res, _} = :erl_eval.expr(ast, []) # 执行结果res为6
内容的提问来源于stack exchange,提问作者cppProgrammer
相关产品推荐
相关产品推荐

