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: Unable to resolve symbol: listo in this context, compiling:(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 に答える