Compilation 如何使用cerl:c_子句定义通配符模式
我正在尝试将一些个人语言编译成erlang。我想在子句上创建一个具有模式匹配的函数 这是我的数据:Compilation 如何使用cerl:c_子句定义通配符模式,compilation,programming-languages,erlang,Compilation,Programming Languages,Erlang,我正在尝试将一些个人语言编译成erlang。我想在子句上创建一个具有模式匹配的函数 这是我的数据: Data = [ {a, <a_body> } , {b, <b_body> } , {c, <c_body> } ]. 所以好的,case在编译core时被转换为if。因此,我需要在if表达式中指定一个true子句,以获得纯通配符。我不知道怎么做,因为在if表达式中匹配true和在情况下匹配是不同的语义。在某种情况下,true
Data =
[ {a, <a_body> }
, {b, <b_body> }
, {c, <c_body> }
].
所以好的,case
在编译core时被转换为if
。因此,我需要在if
表达式中指定一个true
子句,以获得纯通配符。我不知道怎么做,因为在if
表达式中匹配true
和在情况下匹配是不同的语义。在某种情况下,true
不是通配符
如果我想在表达式中匹配通配符,比如{sometag,u,u,Thing}->{ok,Thing}
谢谢你我找到了一个方法
...
WildCardVar = cerl:c_var('_Any'),
WildCardClause = cerl:c_clause([WildCardVar], cerl:c_atom(undefined)),
...
它应该也适用于内部通配符,但必须小心为每个
通配符指定不同的变量名称,因为只有多个
彼此不匹配,而变量却匹配
f(X,_, _ ) %% matches f(a,b,c)
f(X,_X,_X) %% doesn't
接受我自己的答案,因为经过进一步研究,erlang就是这样做的。因为这是唯一的答案:)
'myfuncname'/1 =
fun (Key) ->
case Key of
<'a'> when 'true' -> ...
<'b'> when 'true' -> ...
<'c'> when 'true' -> ...
end
...
WildCardVar = cerl:c_var('_Any'),
WildCardClause = cerl:c_clause([WildCardVar], cerl:c_atom(undefined)),
...
f(X,_, _ ) %% matches f(a,b,c)
f(X,_X,_X) %% doesn't