Clojure не может передать список функции. Ошибка PersistentList не может быть приведена к clojure.lang.IFn - PullRequest
3 голосов
/ 03 мая 2011

У меня есть несколько функций, которые работают со списками.У меня есть четная функция, которая принимает параметр списка и получает четные индексы списка.Нечетная функция делает то же самое, но с нечетными индексами.У меня также есть другая функция, которая объединяет два отсортированных списка, называемая 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 ]

4 голосов
/ 04 мая 2011

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

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

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

3 голосов
/ 03 мая 2011

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

...