4

Scala ラッパーDatomiscaを使用して 2 つのルールを呼び出すDatomicクエリを作成しようとしています。

2 つの個別のクエリを組み合わせるにはどうすればよいですか?

私のコードは次のようになります。

val rule1 = Query.rules("[[(rule1 ?a) [ ... ]]]")
val rule2 = Query.rules("[[(rule2 ?b) [ ... ]]]")

Datomic.q(Query("""[:find ?x
                    :in $ % %
                    :where (rule1 ?a) (rule2 ?b)]"""), conn.db(), rule1, rule2)

これにより、「キーを解決できません」というエラーが表示されますrule1)。1つだけで試してみました%が、コンパイルされません(型の不一致)。

への呼び出しでそれらを 1 つの文字列に結合したくありません。これはQuery.rules、ルールのさまざまな組み合わせを使用するためにそれらを繰り返す必要があることを意味します (たとえば、1 つのクエリで両方を使用し、別のクエリで rule1 のみを使用)。

はマクロであるためQuery.rules、リテラル文字列値を使用する必要があります。そうしないと、コンパイルされません。

4

1 に答える 1

2

Stringルールをs で連結できるように扱うことで、ルールを組み合わせることができます。静的型チェックの利点は得られませんが、他の方法は見つかりませんでした。

val rule1 = "[[(rule1 ?a) [ ... ]]]"
val rule2 = "[[(rule2 ?b) [ ... ]]]"

Datomic.q(Query(...), conn.db(), DString(s"[$rule1 $rule2]"), ...)
于 2014-01-22T14:14:40.247 に答える