當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


erlang fun2ms(LiteralFun)用法及代碼示例

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_ 防護測試。不允許使用在匹配規範中沒有表示的語言結構( ifcasereceive 等)。

返回值是結果匹配規範。

例子:

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.org大神的英文原創作品 fun2ms(LiteralFun) -> MatchSpec。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。