0

ログの目的で標準形式の値を使用し、一定の開始時間と終了時間のタプルと比較してログ エントリを選択できるようにしたいerlang datetimeと考えています。{{Y,M,D},{H,Min,Sec}}MNESIA table

matchspec ガード コンパイラは、タプル値とガード部分式を混同しているようです。の評価ets:match_spec_compile(MatchSpec)に失敗しました

MatchSpec = [
{
{'_','$1','$2'}
,
[
{'==','$2',{1,2}}
]
,
['$_']
}
]

$2しかし、タプル以外の値と比較すると成功します。

マッチガードがタプル値を比較できないという制限はありますか?

4

1 に答える 1

2

答えは、タプルを使用するときに二重中括弧を使用することだと思います ( http://www.erlang.org/doc/apps/erts/match_spec.html#id69408の変数とリテラルのセクションを参照してください)。したがって、matchspec 式でタプルを使用するには、次のようにタプルを中かっこで囲みます。

{'==','$2',{{1,2}}}

したがって、あなたの例を正しく理解していれば、

22> M=[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}].
[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}]

23> ets:match_spec_run([{1,1,{1,2}}],ets:match_spec_compile(M)).
[{1,1,{1,2}}]

24> ets:match_spec_run([{1,1,{2,2}}],ets:match_spec_compile(M)).
[]

編集:(回答を編集して申し訳ありませんが、これが私のコメントを読みやすい形式で取得する最も簡単な方法でした)はい、これが行われなければならない方法です。match-spec を取得する簡単な方法は、リテラルfun を引数としてets:fun2ms/1取り、match-spec を返す(疑似) 関数を使用することです。そう

10> ets:fun2ms(fun ({A,B,C}=X) when C == {1,2} -> X end).
[{{'$1','$2','$3'},[{'==','$3',{{1,2}}}],['$_']}]

シェルは を認識しets:fun2ms/1ます。詳細については、ETS のドキュメントを参照してください。Mnesia は ETS と同じ match-spec を使用します。

于 2013-01-03T19:12:22.623 に答える