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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。