在线文档教程
Erlang 20

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/1io: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=ValueBindingStruct。返回更新的绑定结构。

绑定(Name,BindingStruct) - > {value,value()} | 未绑定

类型

返回Namein 的绑定BindingStruct

绑定(BindingStruct ::)binding_struct()- >bindings()

返回绑定结构中包含的绑定列表。

del_binding(Name,BindingStruct) - > binding_struct()

类型

删除Namein 的绑定BindingStruct。返回更新的绑定结构。

expr(表达式,绑定) - > {value,Value,NewBindings}

expr(表达式,绑定,LocalFunctionHandler) - >

{值,值,新绑定}

EXPR(表达式,

绑定,

LocalFunctionHandler,

NonLocalFunctionHandler) - >

{值,值,新绑定}

EXPR(表达式,

绑定,

LocalFunctionHandler,

非局部函数处理程序,

ReturnFormat) - >

{值,值,新绑定}值

类型

Expression用一组绑定进行评估BindingsExpression是抽象语法中的一个表达式。有关何时以及如何使用参数的解释LocalFunctionHandlerNonLocalFunctionHandler,见节Local Function HandlerNon-Local Function Handler这个模块中。

{value, Value, NewBindings}默认返回。如果ReturnFormatvalue,只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。有关何时以及如何使用参数的解释LocalFunctionHandlerNonLocalFunctionHandler,见节Local Function HandlerNon-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语法,其中MF是原子或表达式。

  • 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,3Func(Fun, Args)Func{Module, Function}, Args)(假定{Module, Function}不是{erlang, apply})

对通过计算有趣表达式定义的函数的调用"fun ... end"也隐藏在非本地函数处理程序中。

非本地函数处理程序参数可能不会像本地函数处理程序参数那样频繁使用。一种可能的用途是打电话给exit/1调用函数时,由于某种原因不允许调用。

已知限制

本模块中未记录的功能将不被使用。