1

根据https://github.com/clojure/core.logic/wiki/Differences-from-The-Reasoned-Schemer core.logic 支持 listo。

但是,以下代码无法编译

(ns test.chap03
  (:refer-clojure :exclude [==])  
  (:use [clojure.core.logic]))

(defn ex07 []
  (run*
    [x]
    (listo `(a b ~x d))))

它抱怨:

异常:java.lang.RuntimeException:无法解析符号:此上下文中的 listo,正在编译:(test/chap03.clj:8)

问题:发生了什么事,我如何获得 listo?

4

2 回答 2

1

listo 未实施。core.logic 并未附带 The Reasoned Schemer 的所有定义。

于 2012-06-01T00:00:49.183 回答
0

正如 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)
于 2020-09-04T04:36:32.577 回答