檢視原始碼 erl_eval (stdlib v6.2)

Erlang 的元直譯器。

此模組提供 Erlang 運算式的直譯器。這些運算式採用抽象語法,由 Erlang 剖析器 erl_parseio 傳回。

本地函式處理器

在函式求值期間,無法呼叫本地函式。會產生未定義函式錯誤。但是,可以使用選用引數 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 語法呼叫函式,其中 MF 是 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

總結

類型

繫結結構。它是一個 map 或一個 orddicterl_eval 將始終傳回與給定類型相同的類型。

在本模組的本地函式處理器章節中進一步說明

在本模組的非本地函式處理器章節中進一步說明。

函式

將繫結 Name=Value 加入 BindingStruct。傳回已更新的繫結結構。

傳回 NameBindingStruct 中的繫結。

傳回繫結結構中包含的繫結列表。

移除 NameBindingStruct 中的繫結。傳回已更新的繫結結構。

使用繫結集 Bindings 求值 ExpressionExpression 是以抽象語法表示的運算式。

並行求值運算式列表,對每個運算式使用相同的初始繫結。嘗試合併從每次求值傳回的繫結。

使用繫結集 Bindings 求值 Expressions,其中 Expressions 是可以由 io:parse_erl_exprs/2 傳回的類型的一連串運算式(以抽象語法表示)。

傳回空的繫結結構。

類型

-type binding_struct() :: orddict:orddict() | map().

繫結結構。它是一個 map 或一個 orddicterl_eval 將始終傳回與給定類型相同的類型。

-type bindings() :: [{name(), value()}].
連結至此類型

expression()

檢視原始碼 (未匯出)
-type expression() :: erl_parse:abstract_expr().
連結至此類型

expression_list()

檢視原始碼 (未匯出)
-type expression_list() :: [expression()].
連結至此類型

expressions()

檢視原始碼 (未匯出)
-type expressions() :: [erl_parse:abstract_expr()].

erl_parse:parse_exprs/1io:parse_erl_exprs/2 傳回。

-type func_spec() :: {Module :: module(), Function :: atom()} | function().
連結至此類型

lfun_eval_handler()

檢視原始碼 (未匯出)
-type lfun_eval_handler() ::
          fun((Name :: atom(), Arguments :: expression_list(), Bindings :: binding_struct()) ->
                  {value, Value :: value(), NewBindings :: binding_struct()}).
連結至此類型

lfun_value_handler()

檢視原始碼 (未匯出)
-type lfun_value_handler() :: fun((Name :: atom(), Arguments :: [term()]) -> Value :: value()).
連結至此類型

local_function_handler()

檢視原始碼 (未匯出)
-type local_function_handler() :: {value, lfun_value_handler()} | {eval, lfun_eval_handler()} | none.

在本模組的本地函式處理器章節中進一步說明

-type name() :: term().
連結至此類型

nlfun_handler()

檢視原始碼 (未匯出)
-type nlfun_handler() ::
          fun((FuncSpec :: func_spec(), Arguments :: [term()]) -> term()) |
          fun((Anno :: erl_anno:anno(), FuncSpec :: func_spec(), Arguments :: [term()]) -> term()).
連結至此類型

non_local_function_handler()

檢視原始碼 (未匯出)
-type non_local_function_handler() :: {value, nlfun_handler()} | none.

在本模組的非本地函式處理器章節中進一步說明。

-type value() :: term().

函式

連結至此函式

add_binding(Name, Value, BindingStruct)

檢視原始碼
-spec add_binding(Name, Value, BindingStruct) -> binding_struct()
                     when Name :: name(), Value :: value(), BindingStruct :: binding_struct().

將繫結 Name=Value 加入 BindingStruct。傳回已更新的繫結結構。

連結至此函式

binding(Name, BindingStruct)

檢視原始碼
-spec binding(Name, BindingStruct) -> {value, value()} | unbound
                 when Name :: name(), BindingStruct :: binding_struct().

傳回 NameBindingStruct 中的繫結。

連結至此函式

bindings(BindingStruct)

檢視原始碼
-spec bindings(BindingStruct :: binding_struct()) -> bindings().

傳回繫結結構中包含的繫結列表。

連結至此函式

del_binding(Name, BindingStruct)

檢視原始碼
-spec del_binding(Name, BindingStruct) -> binding_struct()
                     when Name :: name(), BindingStruct :: binding_struct().

移除 NameBindingStruct 中的繫結。傳回已更新的繫結結構。

連結至此函式

expr(Expression, Bindings)

檢視原始碼
-spec expr(Expression, Bindings) -> {value, Value, NewBindings}
              when
                  Expression :: expression(),
                  Bindings :: binding_struct(),
                  Value :: value(),
                  NewBindings :: binding_struct().

等同於 expr(Expression, Bindings, none)

連結至此函式

expr(Expression, Bindings, LocalFunctionHandler)

檢視原始碼
-spec expr(Expression, Bindings, LocalFunctionHandler) -> {value, Value, NewBindings}
              when
                  Expression :: expression(),
                  Bindings :: binding_struct(),
                  LocalFunctionHandler :: local_function_handler(),
                  Value :: value(),
                  NewBindings :: binding_struct().

等同於 expr(Expression, Bindings, LocalFunctionHandler, none)

連結至此函式

expr(Expression, Bindings, LocalFunctionHandler, NonLocalFunctionHandler)

檢視原始碼
-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 求值 ExpressionExpression 是以抽象語法表示的運算式。

關於何時以及如何使用參數 LocalFunctionHandlerNonLocalFunctionHandler 的說明,請參閱此模組中的本機函式處理器非本機函式處理器章節。

預設情況下返回 {value, Value, NewBindings}。如果 ReturnFormatvalue,則只返回 Value

連結至此函式

expr_list(ExpressionList, Bindings)

檢視原始碼
-spec expr_list(ExpressionList, Bindings) -> {ValueList, NewBindings}
                   when
                       ExpressionList :: expression_list(),
                       Bindings :: binding_struct(),
                       ValueList :: [value()],
                       NewBindings :: binding_struct().

等同於 expr_list(ExpressionList, Bindings, none)

連結至此函式

expr_list(ExpressionList, Bindings, LocalFunctionHandler)

檢視原始碼
-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)

連結至此函式

expr_list(ExpressionList, Bindings, LocalFunctionHandler, NonLocalFunctionHandler)

檢視原始碼
-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}

連結至此函式

exprs(Expressions, Bindings)

檢視原始碼
-spec exprs(Expressions, Bindings) -> {value, Value, NewBindings}
               when
                   Expressions :: expressions(),
                   Bindings :: binding_struct(),
                   Value :: value(),
                   NewBindings :: binding_struct().

等同於 exprs(Expressions, Bindings, none)

連結至此函式

exprs(Expressions, Bindings, LocalFunctionHandler)

檢視原始碼
-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)

連結至此函式

exprs(Expressions, Bindings, LocalFunctionHandler, NonLocalFunctionHandler)

檢視原始碼
-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 傳回的類型的一連串運算式(以抽象語法表示)。

關於何時以及如何使用參數 LocalFunctionHandlerNonLocalFunctionHandler 的說明,請參閱此模組中的本機函式處理器非本機函式處理器章節。

返回 {value, Value, NewBindings}

-spec new_bindings() -> binding_struct().

傳回空的繫結結構。