Функция суммы не работает:/

Только что этот код, казалось, работал, но теперь он больше не делает. Есть ли что-то не так с ним?

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=>

Пора, вероятно, сделать перерыв :)

5
задан StackedCrooked 30 April 2010 в 23:11
поделиться

3 ответа

Возможно, попробуйте:

(defn sum [a b] (+ a b))

Clojure, будучи членом семейства Lisp, всегда использует нотацию префикса для арифметических выражений.

9
ответ дан 18 December 2019 в 14:43
поделиться

Поскольку вы пытаетесь написать такую ​​функцию, мне интересно, было бы полезно указать, что + - это просто обычная функция в Clojure , как и в любом другом Лиспе. Фактически, в Clojure нет специальных «арифметических выражений», только приложения-функции, аргументы которых являются числами, а операторные функции выполняют арифметические операции.

Фактически, в большинстве Лиспов нет специальных «операторов» в смысле выделенных частей синтаксиса, которые нужно было бы заключить в оболочку, чтобы их функциональность была доступна в форме функции. Clojure необычен как Lisp в этом отношении тем, что он явно зависит от своей хост-платформы для некоторых довольно основных функций; например Возведение в степень с плавающей запятой доступно в ванильной Clojure в форме метода pow класса java.lang.Math (но см. clojure.contrib.math для некоторых хороших функций для выполнения различных арифметических операций нет в clojure.core ).

Методы Java должны быть обернуты в Clojure для использования в качестве функций (например, переданы в map и т. Д.), Чтобы таким образом они могли напоминать операторы из таких языков, как C, Python или собственно сама Java. Однако они по-прежнему вызываются с использованием префиксной записи.

2
ответ дан 18 December 2019 в 14:43
поделиться
  • В clojure.core уже есть функция +, поэтому будьте очень осторожны при ее переопределении, вероятно, лучше обойтись без этого.
  • Все лиспы, включая Clojure, используют префиксную нотацию. Вы должны вызывать функцию как (fn-name args). В вашем примере Clojure пытается вызвать Integer как функцию, потому что это первый элемент списка. Целые числа не реализуют интерфейс IFn, что объясняет сообщение об ошибке.
  • На самом деле вы можете получить инфиксную нотацию для математических функций с помощью функции. Об этой функции см. страницу 13 первой главы книги "The Joy Of Clojure", которая находится в свободном доступе здесь: http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf.
2
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: