如果比较列表,Clojure的默认宏中的声明错误

我的问题是关于Clojures deftest宏或更一般的关于如何比较由函数创建的列表的问题。但我对Clojure很陌生,无法识别具体的原因。也许别人有想法?如果比较列表,Clojure的默认宏中的声明错误

首先报道的消息:

FAIL在(到符号列表检验)(util_test.clj:105)
预期:(=(引号(一个(非B)c))的(to-symbol-list [“a”“(not b)”“c”]))
actual:(not(=(a(not b)c)(a(not b)c)))

但是很明显,(=(a(not b)c)(a(not b)c))引用应该是真实的。

其次具体的测试代码:对符号表的

(deftest to-symbol-list-test 

(is (= '(a (not b) c) (to-symbol-list ["a" "(not b)" "c"]))))

三定义:

(defn to-symbol-list [term] 

"Converts a vector based term into a list based term

by converting its elements into symbols recursivly"

(postwalk

#(if (string? %)

(symbol %)

(reverse (into '() %)))

term))

功能甚至应该转换嵌套向量。这是一个例子,其他功能以相同的方式表现。我猜想它可能是由不同类型造成的。例如列表vs lazy-seq和我比较惰性函数而不是数据,但类型似乎是正确的。在REPL我得到:

(type (to-symbol-list ["a" "(not b)" "c"])) 

=> clojure.lang.PersistentList

回答:

to-symbol-list返回3个符号的列表,并且不递归处理嵌套的数据结构。不幸的是,第二个符号的打印方式与您所期望的正确解析的数据结构相同。我认为在这种情况下,使用clojure.edn/read-string(docs here)会更好,这将解析您的数据结构,因为我认为您期待。

(defn to-symbol-list [list-of-strings] 

(map edn/read-string list-of-strings))

(to-symbol-list ["a" "(not b)" "c"])

而且,作为一个提示,以帮助诊断这类在未来的事情,你可以传递一个额外的参数来clojure.test/is将在出现故障的情况下打印出来。这可能是一个函数调用的结果,如:

(ns to-symbols-test 

(:require [clojure.edn :as edn]

[clojure.test :refer [deftest is are testing] :as t]

[clojure.data :as data]

[clojure.pprint :as pp]))

(defn to-symbol-list [l]

(map edn/read-string l))

(defn diff [a b]

(with-out-str (pp/pprint (take 2 (data/diff a b)))))

(deftest test-to-symbol-list

(testing "to-symbol-list should convert recursively"

(let [expected '(a (not b) c)

result (to-symbol-list ["a" "(not b)" "c"])]

(is (= expected result (diff expected result))))))

回答:

似乎to-symbol-list变成"(not b)"串的象征,而不是一个嵌套列表。为了解决这个问题,你需要重构这个函数来考虑parens。假设它看起来像(作为字符串的第一个符号,它会自动调用它自己递归地将结果附加到某种累加器中(SICP充满了这种练习)。

以上是 如果比较列表,Clojure的默认宏中的声明错误 的全部内容, 来源链接: utcz.com/qa/263004.html

回到顶部