9

プログラムでデータログクエリを作成しようとしていますが、関数の例で説明する問題が発生し続けます。

(defn test-expr [attribute]
  `[?entity ~attribute ?value]])

(test-expr 3)を実行すると、次の出力が期待されます。

 [?entity 3 ?value]

しかし、代わりに、私は

[mynamespace/?entity 3 mynamespace/?value]

これは明らかに私が望むものではありません。clojureに「リストを引用して、私が言う変数を展開してください」と伝える方法はありますか?

4

2 に答える 2

12

はいあります。

(defn test-expr [attribute]
  `[~'?entity ~attribute ~'?value])

ここでは、最初に構文引用符の引用符を外し、すぐに記号(~'構成)を再度引用符で囲みます。結果は名前空間のないシンボルです。

これは、それがどのように機能するかを説明する以下と同等です。

(defn test-expr [attribute]
  `[~(quote ?entity) ~attribute ~(quote ?value)])
于 2012-12-07T07:43:11.653 に答える
7

探しているのは、BrandonBloomによるバックティックライブラリですhttps://github.com/brandonbloom/backtick

それはあなたが説明する正確な問題のために作られました。これは、バックティックのように機能するが名前空間のものがない「template」という名前のコマンドを提供します。

Clojureでは、準引用と名前空間の解決が1つの機能に混在しています。これは、「Lisp-1」であるClojureのような言語でマクロを書くのに大きな利点があります(関数と変数に別々の名前空間を持つ「Lisp-2」であるCommon Lispとは対照的です)。

また、これらの機能を混同しない方がよいかもしれないことにも同意しますが、Clojureでのマクロの記述がエレガントでなくなるため、なぜそれがそのように機能するのかがわかります。

于 2012-12-07T15:35:02.943 に答える