Java 使用cons在Clojure中收集对

Java 使用cons在Clojure中收集对,java,clojure,Java,Clojure,我在Clojure中基于Eratosthenes的Sieve编写了一个Sieve类型的函数……并在对列表中遇到了一个错误:ClassCastException Clojure.lang.Cons不能转换为java.lang.Number Clojure.lang.Numbers.rements(Numbers.java:171) 然而,改变标记样式,放弃cons,改用conj或向量对,都解决了这个错误 我仍然在寻找错误的好解释……问题是列表?检查在使用cons构建的序列上失败,如下所示: (

我在Clojure中基于Eratosthenes的Sieve编写了一个Sieve类型的函数……并在对列表中遇到了一个错误:ClassCastException Clojure.lang.Cons不能转换为java.lang.Number Clojure.lang.Numbers.rements(Numbers.java:171)



然而,改变标记样式,放弃cons,改用conj或向量对,都解决了这个错误


我仍然在寻找错误的好解释……

问题是
列表?
检查在使用
cons
构建的序列上失败,如下所示:

(list? (conj () 1)) ;=> true
(list? (cons 1 ())) ; => false
您可以将呼叫切换到
list?
seq?
,它应该可以工作


有关原因的详细信息,我建议您阅读以下答案:

如果您不发布所有相关代码,您就不会期望得到答案。那里没有余数调用。。。显然,
标记除数
缺失。你是对的-他信在某个点上除数?函数接收3个和(4个假)参数。第二个参数不能转换为数字为什么使用不同的制造方式,如(defn mark true[n](conj'(true)n))会产生不同?太好了。谢谢你的解决方案。有趣的名单?在阅读参考中没有讨论。您的示例应该包含在其中,我认为这是设计中的一个错误(列表?(cons 1());=>false@FredAKA,您需要考虑到在Clojure中列表和seq之间有区别。当然,不需要“称”它为列表,并且与使用cons构建的第一个Lisp的众所周知的抽象冲突
;(eratosthenes (list 2 3 4 5 6))
;=> ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number  clojure.lang.Numbers.remainder (Numbers.java:171)
(list? (conj () 1)) ;=> true
(list? (cons 1 ())) ; => false