Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 使用宏生成core.logic语句_Clojure_Clojure Core.logic - Fatal编程技术网

Clojure 使用宏生成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) 我尝试过引用、取消引用和取消引用拼接的每一种组合,但我想不出来

我试图通过“填空”动态构建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)

我尝试过引用、取消引用和取消引用拼接的每一种组合,但我想不出来。如何插入
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的形式。