匹配规范是否仅用于跟踪和从ets表中选择?它们可以用在案例表达中吗?

时间:2012-03-06 18:08:34

标签: erlang

有没有办法使用匹配规范在函数的不同子句之间进行选择?我已经看到匹配规范仅用于跟踪或匹配ets表中的条目。

我想做的例子:

在用户提供的文件中:

Module(m1),  
Function(f1),  
Guard([ %% list of match specifications follows:  
  %% First (and only in this case) match spec:  
   { [{score, '$1', '$2', '$3'}, '$4'], 
       [{is_atom, '$1'}, {is_pid, '$2'}, {is_atom, '$3'}], 
     [true] }  
  ]).

从这个文件中我想生成代码。对我来说重要的是能够使用Guard中的匹配规范来过滤出f1的子句,这样我就可以知道f1的第一个参数何时是形式的元组{score,First,Second,第三个}和is_atom(第一个),is_pid(第二个),is_atom(第三个)。

我有办法生成这样的代码:

case some_unknown_function(MatchSpec, F1Args) of
  true ->
    %% f1's clause matches the MatchSpec
    ;
  false ->
    %% f1's clause does not match the MatchSpec
end.

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:8)

看看ets:match_spec_compile/1ets:match_spec_run/2,他们会完全按照您的意愿行事。