当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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