Clojure无法将列表传递给函数Error PersistentList无法强制转换为clojure.lang.IFn

时间:2011-05-03 17:40:27

标签: list clojure mergesort

我有一些处理列表的函数。我有一个偶数函数,它接受一个list参数并获取列表的偶数索引。奇函数做同样的事情,但奇数索引。我还有另一个函数,它合并了两个名为merge-list的排序列表,它将两个列表作为参数。

问题在于我现在正在编写的函数:merge-sort。

这就是我所拥有的:

(defn merge-sort [lis]
    (if (empty? (rest lis))
        lis
        (merge-list (merge-sort (odd(lis))) (merge-sort (even(lis))))))))

出于某种原因,我不断收到错误

java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.IFn

我可以传递奇函数rest lis,如(odd(rest lis))(与偶数相同)。它运行良好,但显然不能给我我想要的解决方案。

我对Clojure很新,所以任何提示都会受到赞赏。感谢。

2 个答案:

答案 0 :(得分:4)

当Clojure编译器遇到一个列表时,它会查看列表的头部以查找要调用的函数或宏。

错误消息“FooClass无法强制转换为clojure.lang.IFn”通常意味着您在“函数位置”(列表的头部)中有一个FooClass实例,它既不是函数也不是宏。

这通常是由语法错误或错误的宏引起的。如果像amalloy建议的那样,你将列表参数包装在括号中,那就是问题所在。

答案 1 :(得分:3)

(odd lis)(even lis),而不是(odd (lis))。您希望将其作为参数传递,而不是将其作为函数调用,然后传递该结果。