我有一些处理列表的函数。我有一个偶数函数,它接受一个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很新,所以任何提示都会受到赞赏。感谢。
答案 0 :(得分:4)
当Clojure编译器遇到一个列表时,它会查看列表的头部以查找要调用的函数或宏。
错误消息“FooClass无法强制转换为clojure.lang.IFn”通常意味着您在“函数位置”(列表的头部)中有一个FooClass实例,它既不是函数也不是宏。
这通常是由语法错误或错误的宏引起的。如果像amalloy建议的那样,你将列表参数包装在括号中,那就是问题所在。
答案 1 :(得分:3)
(odd lis)
和(even lis)
,而不是(odd (lis))
。您希望将其作为参数传递,而不是将其作为函数调用,然后传递该结果。