Why is clojure adding namespace qualifiers to names inside a backquote?

clojure, datomic, macros

Solution

Yes, there is.

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

Here you first unquote the syntax quotation and then immediately quote the symbol (`~'` construct) again. The result is namespace-less symbol.

It is equivalent to the following, which explains how it works:

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

Problem

I am trying to build datalog queries programmatically, but keep running into the problem that I will illustrate with an example function: ``` (defn test-expr [attribute] `[?entity ~attribute ?value]]) ``` When I run (test-expr 3), I would expect the output: ``` [?entity 3 ?value] ``` But instead, I get ``` [mynamespace/?entity 3 mynamespace/?value] ``` Which obviously is not what I want. Is there a way to tell clojure "please just quote the list and expand variables I tell you to?"

Original source