個人的な言語を erlang にコンパイルしようとしています。句にパターン マッチングを使用する関数を作成したいと考えています。
これは私のデータです:
Data =
[ {a, <a_body> }
, {b, <b_body> }
, {c, <c_body> }
].
これは私が欲しいものです:
foo(a) -> <a_body>;
foo(b) -> <b_body>;
foo(c) -> <c_body>;
foo(_) -> undefined. %% <- this
私は現時点でそれを行います:
MkCaseClause =
fun({Pattern,Body}) ->
cerl:c_clause([cerl:c_atom(Pattern)], deep_literal(Body))
end,
WildCardClause = cerl:c_clause([ ??? ], cerl:c_atom(undefined)),
CaseClauses = [MkCaseClause(S) || S <- Data] ++ [WildCardClause],
だから私が定義するのを手伝ってくださいWildCardClause
。コンパイル済みの関数を a も b も c も指定せずに呼び出すと、結果が** exception error: no true branch found when evaluating an if expression in function ...
.
Core Erlang コードを印刷すると、次のようになります。
'myfuncname'/1 =
fun (Key) ->
case Key of
<'a'> when 'true' -> ...
<'b'> when 'true' -> ...
<'c'> when 'true' -> ...
end
さて、コアがコンパイルされたときにcase
変換されます。if
したがって、純粋なワイルドカードを取得するにtrue
は、式のように句を指定する必要があります。式と式の一致はセマンティクスが異なるif
ため、その方法がわかりません。場合によっては、ワイルドカードではありません。true
if
case
true
そして、のように内部にワイルドカードを含む式を一致させたい場合はどうすればよいでしょうか{sometag,_,_,Thing} -> {ok, Thing}
。
ありがとうございました