TG-*_*G-T 7 macros clojure datomic
我正在尝试以编程方式构建数据记录查询,但继续遇到我将用示例函数说明的问题:
(defn test-expr [attribute]
`[?entity ~attribute ?value]])
Run Code Online (Sandbox Code Playgroud)
当我运行(test-expr 3)时,我会期望输出:
[?entity 3 ?value]
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了
[mynamespace/?entity 3 mynamespace/?value]
Run Code Online (Sandbox Code Playgroud)
这显然不是我想要的.有没有办法告诉clojure"请引用列表并扩展我告诉你的变量?"
就在这里.
(defn test-expr [attribute]
`[~'?entity ~attribute ~'?value])
Run Code Online (Sandbox Code Playgroud)
在这里,您首先取消引用语法引用,然后立即~'再次引用符号(构造).结果是无名称空间的符号.
它等同于以下内容,它解释了它的工作原理:
(defn test-expr [attribute]
`[~(quote ?entity) ~attribute ~(quote ?value)])
Run Code Online (Sandbox Code Playgroud)
您正在寻找的是Brandon Bloom的反引号库https://github.com/brandonbloom/backtick
它是为您描述的确切问题而构建的.它提供了一个名为'template'的命令,它的作用类似于反引号,但没有命名空间.
在Clojure中,quasiquotation和名称空间解析在一个特征中混合在一起.这对于像Clojure这样的语言编写宏有很大好处,Clojure是一个"Lisp-1"(与Common Lisp相反,它是一个"Lisp-2",具有单独的函数和变量名称空间.)
我也同意最好不要混淆这些功能,但它会使Clojure中的宏写得不那么优雅,所以我可以看出它为什么会这样运作.