> Erlang中文手册 > fun2ms/1 把语法函数转为匹配规范的伪函数

ets:fun2ms/1

把语法函数转为匹配规范的伪函数

用法:

fun2ms(LiteralFun) -> MatchSpec

使用一个解析转换的仿函数 ListeralFun 作为参数传递给该函数转换出一个匹配规范。"literal" 意味着函数必须以的文本的形式作为函数的参数,它不能是依次传递给函数的变量。

匹配规范解析转换是在 ms_transform 模块里实现,源码里必须引入标准库(STDLIB)里的 "ms_transform.hrl" 的头文件才能使仿函数正常使用。源码里引入头文件失败的话,会报一个运行时错误,而不是一个编译时错误。包函此文件很简单,只要在代码文件里添加下面一行就行:

-include_lib("stdlib/include/ms_transform.hrl").

伪函数 LiteralFun 的有很严格的限制条件,它只提供一个的参数(用于匹配的对象):一个单一的变量或一个元组。而且必须使用像 is_XXX 类似的断言检测。例如:if、case、receive 之类的语法结果是不允许出现在匹配规范中的。

函数返回的值就是一个匹配规范。

ets:fun2ms(fun({M, N}) when N > 3 -> M end).

伪函数 LiteralFun 可以读取外部的变量,例如像这样:

X = 3,
ets:fun2ms(fun({M, N}) when N > X -> M end).

外部读取的变量将会被匹配规范里的常量表达式替换,这符合 Erlang 函数的静态作用域。

局部函数或全局函数是不能出现在函数的断言里。

ets:fun2ms(fun({M, N}) when N > 3, is_atomm(M) -> M end).

Erlang 内置的函数可以被匹配规范函数调用。

ets:fun2ms(fun({M, N}) when N > 3, is_atom(M) -> M end).