Clojure 使用宏生成core.logic语句
我试图通过“填空”动态构建core.logic语句。下面是一个简单的例子:Clojure 使用宏生成core.logic语句,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我试图通过“填空”动态构建core.logic语句。下面是一个简单的例子: (def number 42) (def stmt `(run* [q] (== q ~number)) (eval stmt) 但是我得到了一个clojure.lang.Compiler$CompilerException:java.lang.RuntimeException:没有这样的var:user/q,compileing:(null:20:12) 我尝试过引用、取消引用和取消引用拼接的每一种组合,但我想不出来
(def number 42)
(def stmt `(run* [q] (== q ~number))
(eval stmt)
但是我得到了一个clojure.lang.Compiler$CompilerException:java.lang.RuntimeException:没有这样的var:user/q,compileing:(null:20:12)
我尝试过引用、取消引用和取消引用拼接的每一种组合,但我想不出来。如何插入q
(退一步说,建立这样的语句是正确的方法吗?如果您的逻辑语句存储为字符串,您可以使用
读取字符串
获得Clojure表单,然后调用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)
注意:
`
、~
或~@
通常用于宏定义。如果逻辑语句存储为字符串,则可以使用读取字符串
生成Clojure表单,然后对其调用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)
注意:
`
、~
或~@
通常用于宏定义。由于使用的是语法引号,因此符号q
在当前命名空间中被引用
将其引用为不合格,但将其解压缩为不引用语法本身:
(def stmt `(run* [~'q] (== ~'q ~number)))
或者生成一个符号
(def stmt `(run* [q#] (== q# ~number)))
由于您使用的是syntax quote,因此符号
q
在当前名称空间中被引用
将其引用为不合格,但将其解压缩为不引用语法本身:
(def stmt `(run* [~'q] (== ~'q ~number)))
或者生成一个符号
(def stmt `(run* [q#] (== q# ~number)))
读取字符串
违背了使用Clojure数据结构的目的。我需要宏功能,以便在run*
宏中解压缩更复杂的操作。read string
无法使用Clojure数据结构。我需要在run*
宏中使用宏功能来进行更复杂的操作。q#
符号生成似乎是一个方向,因为它看起来比引号未加引号的~'q
更容易混淆。如果e。G数字是一种带有不同q的形式。符号的生成似乎是一种方式,因为它比引号中的未加引号的~'q
看起来更容易混淆。如果e。G数字是一种带有不同q的形式。