Compilation 如何使用cerl:c_子句定义通配符模式

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

我正在尝试将一些个人语言编译成erlang。我想在子句上创建一个具有模式匹配的函数

这是我的数据:

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