• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

clojure 来源:Daniel 4次浏览

我的问题是关于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)))))) 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)