私はプログラム的にデータログのクエリを構築するが、私は例の機能を説明します問題に実行して維持しようとしています:clojureがバッククォート内の名前に名前空間修飾子を追加するのはなぜですか?
(defn test-expr [attribute]
`[?entity ~attribute ?value]])
私は(テスト-exprの3)を実行すると、私は出力を期待する:
[?entity 3 ?value]
しかし、代わりに、私は明らかに私が欲しいものではありません
[mynamespace/?entity 3 mynamespace/?value]
を取得します。 clojureに "リストを引用して変数を展開してください"と伝える方法はありますか?
理由は、使用しているのと同じ名前の関数や変数を定義することで、ユーザーが誤ってマクロを壊さないようにするためです。 – Cubic
@Cubic、agree。私が理解する限り、これはSchemeの衛生的なマクロとCommon Lispのプレーンなマクロシステムとの間にある種の妥協点です。マクロの定義はCommon Lispのものとほぼ同じです(これはスキームマクロがIMOを書くのが難しいためです)。あるレベルの衛生状態が存在します - シンボルは盲目的に捕捉されませんが、代わりに名前空間の接頭辞が付きます。また、必要に応じて(例えば、擬似的なマクロの場合)通常の置換にいつでも戻すことができます。 –