erl_eval
erl_eval
模块
erl_eval
模块摘要
Erlang元解释器。
描述
这个模块为Erlang表达式提供了一个解释器。返回的抽象语法中的表达式。erl_parse
、Erlang解析器,或io
...
数据类型
bindings() = [{
name()
,
value()
}]
binding_struct() =
orddict:orddict()
绑定结构。
expression() =
erl_parse:abstract_expr()
expressions() = [
erl_parse:abstract_expr()
]
由erl_parse:parse_exprs/1
或io:parse_erl_exprs/2
...
expression_list() = [
expression()
]
func_spec() =
{Module :: module(), Function :: atom()} | function()
lfun_eval_handler() =
fun((Name :: atom(),
Arguments ::
expression_list()
,
Bindings ::binding_struct()) ->
{value,
Value ::
value()
,
NewBindings ::
binding_struct()
})
lfun_value_handler() =
fun((Name :: atom(), Arguments :: [term()]) ->
Value ::
value()
)
local_function_handler() =
{value,
lfun_value_handler()
} |
{eval,
lfun_eval_handler()
} |
none
Local Function Handler
在本单元的章节中进一步描述
name() = term()
nlfun_handler() =
fun((FuncSpec ::func_spec(), Arguments :: [term()]) -> term())
non_local_function_handler() = {value,
nlfun_handler()
} | none
Non-Local Function Handler
在本单元的章节中进一步描述。
value() = term()
出口
add_binding(Name,Value,BindingStruct) - > binding_struct()
类型
添加绑定Name=Value
到BindingStruct
。返回更新的绑定结构。
绑定(Name,BindingStruct) - > {value,value()} | 未绑定
类型
返回Name
in 的绑定BindingStruct
。
绑定(BindingStruct ::)binding_struct()- >bindings()
返回绑定结构中包含的绑定列表。
del_binding(Name,BindingStruct) - > binding_struct()
类型
删除Name
in 的绑定BindingStruct
。返回更新的绑定结构。
expr(表达式,绑定) - > {value,Value,NewBindings}
expr(表达式,绑定,LocalFunctionHandler) - >
{值,值,新绑定}
EXPR(表达式,
绑定,
LocalFunctionHandler,
NonLocalFunctionHandler) - >
{值,值,新绑定}
EXPR(表达式,
绑定,
LocalFunctionHandler,
非局部函数处理程序,
ReturnFormat) - >
{值,值,新绑定}值
类型
Expression
用一组绑定进行评估Bindings
。Expression
是抽象语法中的一个表达式。有关何时以及如何使用参数的解释LocalFunctionHandler
和NonLocalFunctionHandler
,见节Local Function Handler
和Non-Local Function Handler
这个模块中。
{value, Value, NewBindings}
默认返回。如果ReturnFormat
是value
,只Value
返回。
expr_list(ExpressionList,Bindings) - > {ValueList,NewBindings}
expr_list(ExpressionList,Bindings,LocalFunctionHandler) - >
{ValueList,NewBinding}
一个expr_list(表达式列表,
绑定,
LocalFunctionHandler,
NonLocalFunctionHandler) - >
{ValueList,NewBinding}
类型
并行计算表达式列表,对每个表达式使用相同的初始绑定。尝试合并从每个评估返回的绑定。该功能很有用LocalFunctionHandler
,请参阅本章节Local Function Handler
。
返回{ValueList, NewBindings}
。
exprs(表达式,绑定) - > {value,Value,NewBindings}
exprs(表达式,绑定,LocalFunctionHandler) - >
{值,值,新绑定}
exprs(表达式,
绑定,
LocalFunctionHandler,
NonLocalFunctionHandler) - >
{值,值,新绑定}
类型
Expressions
使用绑定集进行评估Bindings
,其中Expressions
是可以返回的类型的表达式序列(以抽象语法表示)io:parse_erl_exprs/2
。有关何时以及如何使用参数的解释LocalFunctionHandler
和NonLocalFunctionHandler
,见节Local Function Handler
和Non-Local Function Handler
这个模块中。
返回 {value, Value, NewBindings}
new_bindings() - > binding_struct()
返回空绑定结构。
局部函数处理程序
在计算函数时,不能调用本地函数。将生成一个未定义的函数错误。但是,可选的参数LocalFunctionHandler
可以用于定义在调用本地函数时调用的函数。参数可以有以下格式:
{value,Func}
这定义了一个本地函数处理程序,该函数处理程序使用以下方法调用:
Func(Name, Arguments)
Name
是本地函数(一个原子)的名称,Arguments
是被评估
参数的列表。函数处理程序返回本地函数的值。在这种情况下,当前绑定无法访问。为了指示错误,函数处理函数调用exit/1
一个合适的退出值。
{eval,Func}
这定义了一个本地函数处理程序,该函数处理程序使用以下方法调用:
Func(Name, Arguments, Bindings)
Name
是本地函数的名称(一个原子),Arguments
是未评估
参数的列表,并且Bindings
是当前变量绑定。函数处理程序返回:
{value,Value,NewBindings}
Value
是本地函数的值,并且NewBindings
是更新的变量绑定。在这种情况下,函数处理程序必须自己评估所有函数参数并管理绑定。为了指示错误,函数处理函数调用exit/1
一个合适的退出值。
none
没有本地函数处理程序。
非局部函数处理器
可选论点NonLocalFunctionHandler
可用于定义在下列情况下调用的函数:
- 函数对象(fun)被调用。
- 一个内置函数被调用。
- 函数使用
M:F
语法,其中M
和F
是原子或表达式。
Op/A
调用操作符(这是作为函数调用处理的erlang:Op/A
)。
例外情况是打电话给erlang:apply/2,3
; 这些调用都不会调用函数处理程序。参数可以有以下格式:
{value,Func}
这定义了一个非本地函数处理程序,该非本地函数处理程序使用:
Func(FuncSpec, Arguments)
FuncSpec
是表单{Module,Function}
或函数上函数的名称,并且Arguments
是被评估
参数的列表。函数处理函数返回函数的值。为了指示错误,函数处理函数调用exit/1
一个合适的退出值。
none
没有非本地函数处理程序。
注
对于诸如erlang:apply(Fun, Args)
或erlang:apply(Module, Function, Args)
的调用,与erlang:apply/2,3
自己(Func{erlang, apply}, [Fun, Args])或
Func{erlang, apply}, [Module, Function, Args]))的
调用相对应的非本地函数处理程序的调用永远不会发生。
然而,非局部函数处理程序被
调用时,调用的评估参数为erlang:apply/2,3
:Func(Fun, Args)
或Func{Module, Function}, Args)(
假定{Module, Function}不
是{erlang, apply})
。
对通过计算有趣表达式定义的函数的调用"fun ... end"
也隐藏在非本地函数处理程序中。
非本地函数处理程序参数可能不会像本地函数处理程序参数那样频繁使用。一种可能的用途是打电话给exit/1
调用函数时,由于某种原因不允许调用。
已知限制
本模块中未记录的功能将不被使用。