檢視原始碼 erl_eval (stdlib v6.2)
Erlang 的元直譯器。
此模組提供 Erlang 運算式的直譯器。這些運算式採用抽象語法,由 Erlang 剖析器 erl_parse
或 io
傳回。
本地函式處理器
在函式求值期間,無法呼叫本地函式。會產生未定義函式錯誤。但是,可以使用選用引數 LocalFunctionHandler
來定義在呼叫本地函式時呼叫的函式。引數可以有以下格式
{value,Func}
- 這會定義一個本地函式處理器,使用以下方式呼叫:Func(Name, Arguments)
Name
是本地函式(一個 atom)的名稱,而Arguments
是*已求值*引數的列表。函式處理器會傳回本地函式的值。在這種情況下,無法存取目前的繫結。若要發出錯誤訊號,函式處理器會使用合適的結束值呼叫exit/1
。{eval,Func}
- 這會定義一個本地函式處理器,使用以下方式呼叫:Func(Name, Arguments, Bindings)
Name
是本地函式(一個 atom)的名稱,Arguments
是*未求值*引數的列表,而Bindings
是目前的變數繫結。函式處理器會傳回{value,Value,NewBindings}
Value
是本地函式的值,而NewBindings
是更新後的變數繫結。在這種情況下,函式處理器必須自行求值所有函式引數並管理繫結。若要發出錯誤訊號,函式處理器會使用合適的結束值呼叫exit/1
。none
- 沒有本地函式處理器。
非本地函式處理器
選用引數 NonLocalFunctionHandler
可以用來定義在以下情況中呼叫的函式:
- 呼叫函數物件 (fun)。
- 呼叫內建函式。
- 使用
M:F
語法呼叫函式,其中M
和F
是 atom 或運算式。 - 呼叫運算子
Op/A
(這會被處理為呼叫函式erlang:Op/A
)。
例外情況是呼叫 erlang:apply/2,3
;這類呼叫不會呼叫任何函式處理器。引數可以有以下格式:
{value,Func}
- 這會定義一個非本地函式處理器。該函式可以使用兩個引數呼叫:Func(FuncSpec, Arguments)
或三個引數
Func(Anno, FuncSpec, Arguments)
Anno
是節點的erl_anno:anno()
,FuncSpec
是{Module,Function}
形式的函式名稱或一個 fun,而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 運算式
"fun ... end"
所定義的函式的呼叫也會對非本地函式處理器隱藏。
非本地函式處理器引數的使用頻率可能不如本地函式處理器引數。一個可能的用途是在呼叫由於某些原因不允許呼叫的函式時呼叫 exit/1
。
總結
函式
將繫結 Name=Value
加入 BindingStruct
。傳回已更新的繫結結構。
傳回 Name
在 BindingStruct
中的繫結。
傳回繫結結構中包含的繫結列表。
移除 Name
在 BindingStruct
中的繫結。傳回已更新的繫結結構。
使用繫結集 Bindings
求值 Expression
。Expression
是以抽象語法表示的運算式。
並行求值運算式列表,對每個運算式使用相同的初始繫結。嘗試合併從每次求值傳回的繫結。
使用繫結集 Bindings
求值 Expressions
,其中 Expressions
是可以由 io:parse_erl_exprs/2
傳回的類型的一連串運算式(以抽象語法表示)。
傳回空的繫結結構。
類型
-type binding_struct() :: orddict:orddict() | map().
繫結結構。它是一個 map
或一個 orddict
。erl_eval
將始終傳回與給定類型相同的類型。
-type expression() :: erl_parse:abstract_expr().
-type expression_list() :: [expression()].
-type expressions() :: [erl_parse:abstract_expr()].
-type lfun_eval_handler() :: fun((Name :: atom(), Arguments :: expression_list(), Bindings :: binding_struct()) -> {value, Value :: value(), NewBindings :: binding_struct()}).
-type local_function_handler() :: {value, lfun_value_handler()} | {eval, lfun_eval_handler()} | none.
在本模組的本地函式處理器章節中進一步說明
-type name() :: term().
-type non_local_function_handler() :: {value, nlfun_handler()} | none.
在本模組的非本地函式處理器章節中進一步說明。
-type value() :: term().
函式
-spec add_binding(Name, Value, BindingStruct) -> binding_struct() when Name :: name(), Value :: value(), BindingStruct :: binding_struct().
將繫結 Name=Value
加入 BindingStruct
。傳回已更新的繫結結構。
-spec binding(Name, BindingStruct) -> {value, value()} | unbound when Name :: name(), BindingStruct :: binding_struct().
傳回 Name
在 BindingStruct
中的繫結。
-spec bindings(BindingStruct :: binding_struct()) -> bindings().
傳回繫結結構中包含的繫結列表。
-spec del_binding(Name, BindingStruct) -> binding_struct() when Name :: name(), BindingStruct :: binding_struct().
移除 Name
在 BindingStruct
中的繫結。傳回已更新的繫結結構。
-spec expr(Expression, Bindings) -> {value, Value, NewBindings} when Expression :: expression(), Bindings :: binding_struct(), Value :: value(), NewBindings :: binding_struct().
-spec expr(Expression, Bindings, LocalFunctionHandler) -> {value, Value, NewBindings} when Expression :: expression(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), Value :: value(), NewBindings :: binding_struct().
-spec expr(Expression, Bindings, LocalFunctionHandler, NonLocalFunctionHandler) -> {value, Value, NewBindings} when Expression :: expression(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), NonLocalFunctionHandler :: non_local_function_handler(), Value :: value(), NewBindings :: binding_struct().
等同於 expr(Expression, Bindings, LocalFunctionHandler, NonLocalFunctionHandler, none)
。
expr(Expression, Bindings, LocalFunctionHandler, NonLocalFunctionHandler, ReturnFormat)
檢視原始碼-spec expr(Expression, Bindings, LocalFunctionHandler, NonLocalFunctionHandler, ReturnFormat) -> {value, Value, NewBindings} | Value when Expression :: expression(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), NonLocalFunctionHandler :: non_local_function_handler(), ReturnFormat :: none | value, Value :: value(), NewBindings :: binding_struct().
使用繫結集 Bindings
求值 Expression
。Expression
是以抽象語法表示的運算式。
關於何時以及如何使用參數 LocalFunctionHandler
和 NonLocalFunctionHandler
的說明,請參閱此模組中的本機函式處理器和非本機函式處理器章節。
預設情況下返回 {value, Value, NewBindings}
。如果 ReturnFormat
為 value
,則只返回 Value
。
-spec expr_list(ExpressionList, Bindings) -> {ValueList, NewBindings} when ExpressionList :: expression_list(), Bindings :: binding_struct(), ValueList :: [value()], NewBindings :: binding_struct().
-spec expr_list(ExpressionList, Bindings, LocalFunctionHandler) -> {ValueList, NewBindings} when ExpressionList :: expression_list(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), ValueList :: [value()], NewBindings :: binding_struct().
等同於 expr_list(ExpressionList, Bindings, LocalFunctionHandler, none)
。
-spec expr_list(ExpressionList, Bindings, LocalFunctionHandler, NonLocalFunctionHandler) -> {ValueList, NewBindings} when ExpressionList :: expression_list(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), NonLocalFunctionHandler :: non_local_function_handler(), ValueList :: [value()], NewBindings :: binding_struct().
並行求值運算式列表,對每個運算式使用相同的初始繫結。嘗試合併從每次求值傳回的繫結。
此函式在 LocalFunctionHandler
中很有用,請參閱此模組中的本機函式處理器章節。
返回 {ValueList, NewBindings}
。
-spec exprs(Expressions, Bindings) -> {value, Value, NewBindings} when Expressions :: expressions(), Bindings :: binding_struct(), Value :: value(), NewBindings :: binding_struct().
-spec exprs(Expressions, Bindings, LocalFunctionHandler) -> {value, Value, NewBindings} when Expressions :: expressions(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), Value :: value(), NewBindings :: binding_struct().
等同於 exprs(Expressions, Bindings, LocalFunctionHandler, none)
。
-spec exprs(Expressions, Bindings, LocalFunctionHandler, NonLocalFunctionHandler) -> {value, Value, NewBindings} when Expressions :: expressions(), Bindings :: binding_struct(), LocalFunctionHandler :: local_function_handler(), NonLocalFunctionHandler :: non_local_function_handler(), Value :: value(), NewBindings :: binding_struct().
使用繫結集 Bindings
求值 Expressions
,其中 Expressions
是可以由 io:parse_erl_exprs/2
傳回的類型的一連串運算式(以抽象語法表示)。
關於何時以及如何使用參數 LocalFunctionHandler
和 NonLocalFunctionHandler
的說明,請參閱此模組中的本機函式處理器和非本機函式處理器章節。
返回 {value, Value, NewBindings}
-spec new_bindings() -> binding_struct().
傳回空的繫結結構。