0

我正在尝试通过“填空”动态构建 core.logic 语句。这是一个简单的例子:

(def number 42)
(def stmt `(run* [q] (== q ~number))
(eval stmt)

但是我得到一个clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: No such var: user/q, compiling:(null:20:12).

我已经尝试了引用、取消引用和取消引用拼接的所有组合,但我无法弄清楚。我应该如何插入q

(而且,退后一步,建立这样的陈述是正确的方式吗?)

4

2 回答 2

4

由于您使用的是语法引用,因此该符号q在当前命名空间中被引用。

引用它是不合格的,但不引用它而不是语法引用引用本身:

(def stmt `(run* [~'q] (== ~'q ~number)))

或生成符号

(def stmt `(run* [q#] (== q# ~number)))
于 2015-04-21T12:25:26.823 回答
0

如果您的逻辑语句存储为字符串,您可以使用read-stringClojure 表单然后调用eval它:

(def number 42)
(def stmt-as-str "(run* [q] (== q number))")
(eval (read-string stmt-as-str))
> (42)

或者,如果它只是一种形式:

(def stmt-as-form '(run* [q] (== q number)))
(eval stmt-as-form)
> (42)

注意:`,~~@通常用于宏定义。

于 2015-04-21T10:58:10.093 回答