Clojure中的IllegalArgumentException错误

时间:2017-08-21 00:53:15

标签: clojure illegalargumentexception

我收到此错误:

  

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))

3 个答案:

答案 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代码:

REPL DEBUGGING: NO STACKTRACE REQUIRED

Debugging with the Scientific Method - Stuart Halloway