Clojure не может передать список функции Ошибка PersistentList не может быть приведена к clojure.lang.IFn

У меня есть несколько функций, которые имеют дело со списками. У меня есть четная функция, которая принимает параметр списка и получает четные индексы списка. Нечетная функция делает то же самое, но с нечетными индексами. У меня также есть другая функция, которая объединяет два отсортированных списка, называемая merge-list, которая принимает два списка в качестве параметров.

Проблема с функцией, которую я сейчас пишу: сортировка слиянием.

Вот что у меня есть:

(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, поэтому буду признателен за любые советы. Спасибо.


person Link    schedule 03.05.2011    source источник
comment
Почему вы отредактировали свой код? Теперь никто не может учиться на вашем опыте. Я бы отредактировал его обратно, но, может быть, у вас есть причина.   -  person amalloy    schedule 04.05.2011
comment
Не могли бы вы опубликовать свой код? Трудно точно сказать, что вы делаете неправильно, если мы не видим ваш код.   -  person Matthew Boston    schedule 04.05.2011


Ответы (2)


(odd lis) и (even lis), а не (odd (lis)). Вы хотите передать его как параметр, а не вызывать как функцию, а затем передать результат этого.

person amalloy    schedule 03.05.2011

Когда компилятор Clojure встречает список, он ищет в начале списка функцию или макрос для вызова.

Сообщение об ошибке «FooClass не может быть приведено к clojure.lang.IFn» обычно означает, что у вас есть экземпляр FooClass в «позиции функции» (заголовок списка), который не является ни функцией, ни макросом.

Часто это вызвано синтаксической ошибкой или глючным макросом. Если, как предлагает amalloy, вы заключаете аргумент списка в круглые скобки, то проблема в этом.

person Stuart Sierra    schedule 04.05.2011
comment
Раньше он помещал код рядом с вопросом, а потом по какой-то причине (видимо, после моего ответа и до вашего) он его отредактировал. - person amalloy; 04.05.2011
comment
Извините за то, что я положил его обратно. Спасибо за вашу помощь! - person Link; 05.05.2011