[英]Clojure, core.logic: listo
根据https://github.com/clojure/core.logic/wiki/Differences-from-The-Reasoned-Schemer core.logic 支持列表。
但是,以下代码无法编译
(ns test.chap03
(:refer-clojure :exclude [==])
(:use [clojure.core.logic]))
(defn ex07 []
(run*
[x]
(listo `(a b ~x d))))
它抱怨:
异常:java.lang.RuntimeException:无法解析符号:在此上下文中的列表,正在编译:(test/chap03.clj:8)
问题:这是怎么回事,我如何获得列表?
listo 未实施。 core.logic 并未附带 The Reasoned Schemer 的所有定义。
正如 user1311390 指出的那样,它们在测试中可用。
https://github.com/clojure/core.logic/blob/master/src/test/clojure/clojure/core/logic/tests.clj#L459这里是实现listo的部分。
(defn pairo [p]
(fresh [a d]
(== (lcons a d) p)))
(defn listo [l]
(conde
[(emptyo l) s#]
[(pairo l)
(fresh [d]
(resto l d)
(listo d))]))
现在我们可以得到预期的行为。 请注意,为简洁起见,我特意没有将整个缺失的实现包含在 The Reasoned Schemer 中。 见上面的链接。
(run 1
[x]
(listo `(a b ~x d)))
;; => (_0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.