fun2ms(LiteralFun) -> MatchSpec
LiteralFun = function()
MatchSpec = match_spec()
偽函數,由parse_transform
翻譯LiteralFun
在函數調用中作為參數輸入匹配規格。 "literal" 意味著 fun 必須以文本方式編寫為函數的參數,它不能保存在依次傳遞給函數的變量中。
解析轉換在 ms_transform
模塊中提供,並且源必須在 STDLIB 中包含文件 ms_transform.hrl
才能使該偽函數正常工作。未能在源代碼中包含 hrl 文件會導致運行時錯誤,而不是編譯時錯誤。通過將 -include_lib("stdlib/include/ms_transform.hrl").
行添加到源文件中,可以最輕鬆地包含包含文件。
樂趣非常有限,它隻能采用單個參數(要匹配的對象):單個變量或元組。它必須使用is_
防護測試。不允許使用在匹配規範中沒有表示的語言結構( if
、 case
、 receive
等)。
返回值是結果匹配規範。
例子:
1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
[{{'$1','$2'},[{'>','$2',3}],['$1']}]
可以導入環境中的變量,以便進行以下操作:
2> X=3.
3
3> ets:fun2ms(fun({M,N}) when N > X -> M end).
[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]
導入的變量被匹配規範 const
表達式替換,這與 Erlang funs 的靜態作用域一致。但是,本地或全局函數調用不能位於 fun 的守衛或主體中。當然允許調用內置匹配規範函數:
4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
Error: fun containing local Erlang function calls
('my_fun' called in guard) cannot be translated into match_spec
{error,transform_error}
5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]
如示例所示,該函數也可以從 shell 調用。當從 shell 中使用時,樂趣也必須真正體現在調用中。
如果 parse_transform
未應用於調用此偽函數的模塊,則調用將在運行時失敗(帶有 badarg
)。 ets
模塊導出一個具有此名稱的函數,但除非在 shell 中使用該函數,否則永遠不會調用它。如果通過包含頭文件 ms_transform.hrl
正確應用 parse_transform
,則編譯後的代碼永遠不會調用該函數,但函數調用將被文字匹配規範替換。
有關詳細信息,請參閱
ms_transform(3)
.
相關用法
- erlang fun_to_list(Fun)用法及代碼示例
- erlang float用法及代碼示例
- erlang file_read用法及代碼示例
- erlang file_size用法及代碼示例
- erlang from_list用法及代碼示例
- erlang find用法及代碼示例
- erlang float(Number)用法及代碼示例
- erlang float_to_binary(Float, Options)用法及代碼示例
- erlang float_to_list(Float, Options)用法及代碼示例
- erlang floor(Number)用法及代碼示例
- erlang filter(Fun, Q1 :: queue(Item))用法及代碼示例
- erlang filtermap(Fun, Q1)用法及代碼示例
- erlang fold(Fun, Acc0, Q :: queue(Item))用法及代碼示例
- erlang fetch(Key, Orddict)用法及代碼示例
- erlang fetch_keys(Orddict)用法及代碼示例
- erlang filter(Pred, Orddict1)用法及代碼示例
- erlang find(Key, Orddict)用法及代碼示例
- erlang fold(Fun, Acc0, Orddict)用法及代碼示例
- erlang foldl(Fun, Acc0, Archive)用法及代碼示例
- erlang format(Format)用法及代碼示例
- erlang fread(Prompt, Format)用法及代碼示例
- erlang filter(Pred, MapOrIter)用法及代碼示例
- erlang filtermap(Fun, MapOrIter)用法及代碼示例
- erlang find(Key, Map)用法及代碼示例
- erlang fold(Fun, Init, MapOrIter)用法及代碼示例
注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 fun2ms(LiteralFun) -> MatchSpec。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。