我收到此错误:
IllegalArgumentException不知道如何创建ISeq:clojure.lang.Symbol clojure.lang.RT.seqFrom(RT.java:542)
当我调用此函数时:
(defn my-butlast [lista]
(loop [c lista
last ()]
(if (= (count c) 1)
last
(recur (concat last (first c))
(pop c)))))
该函数应返回一个列表,其中包含与其输入列表相同的元素,但不包括最后一个元素,或者'()'如果它是空的。
只有当列表包含两个或更多元素时才会出现错误:
(my-butlast '(a b))
答案 0 :(得分:2)
concat
:“所提供的 colls ”中元素的连接(取自https://clojuredocs.org/clojure.core/concat)。您的错误似乎与未传递concat
正确的参数类型一致。您可以尝试使用conj
代替concat
,或者将第二个参数包含在concat
的{{1}}中。
如果您选择vector
,请务必了解conj
之间的conj
经文与list
之间的不同行为:https://clojuredocs.org/clojure.core/conj
答案 1 :(得分:1)
我建议采用不同的方法,在我看来稍微简单一些。尝试类似(reverse (rest (reverse list)))
的内容。
如果这就是你所需要的,不需要复杂化。如果你真的有这样的理由,那就读一下concat
,这就是错误的来源。
答案 2 :(得分:1)
正如其他人所说,concat
只需collections
。
这是令人讨厌的表达方式:
(concat last (first c))
看一下这些链接,因为它们提供了一些有用的技巧,以帮助调试您的Clojure代码: