Только что этот код, казалось, работал, но теперь он больше не делает. Есть ли что-то не так с ним?
user=> (defn sum [a b] (a + b))
#'user/sum
user=> (sum 3 4)
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=>
Пора, вероятно, сделать перерыв :)
Возможно, попробуйте:
(defn sum [a b] (+ a b))
Clojure, будучи членом семейства Lisp, всегда использует нотацию префикса для арифметических выражений.
Поскольку вы пытаетесь написать такую функцию, мне интересно, было бы полезно указать, что + - это просто обычная функция в Clojure , как и в любом другом Лиспе. Фактически, в Clojure нет специальных «арифметических выражений», только приложения-функции, аргументы которых являются числами, а операторные функции выполняют арифметические операции.
Фактически, в большинстве Лиспов нет специальных «операторов» в смысле выделенных частей синтаксиса, которые нужно было бы заключить в оболочку, чтобы их функциональность была доступна в форме функции. Clojure необычен как Lisp в этом отношении тем, что он явно зависит от своей хост-платформы для некоторых довольно основных функций; например Возведение в степень с плавающей запятой доступно в ванильной Clojure в форме метода pow
класса java.lang.Math
(но см. clojure.contrib.math
для некоторых хороших функций для выполнения различных арифметических операций нет в clojure.core
).
Методы Java должны быть обернуты в Clojure для использования в качестве функций (например, переданы в map
и т. Д.), Чтобы таким образом они могли напоминать операторы из таких языков, как C, Python или собственно сама Java. Однако они по-прежнему вызываются с использованием префиксной записи.
(fn-name args)
. В вашем примере Clojure пытается вызвать Integer как функцию, потому что это первый элемент списка. Целые числа не реализуют интерфейс IFn, что объясняет сообщение об ошибке.