Функция Sum не работает: / - PullRequest
5 голосов
/ 01 мая 2010

Некоторое время назад этот код, казалось, работал, но теперь больше не работает. Что-то не так с этим?

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

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

Ответы [ 3 ]

9 голосов
/ 01 мая 2010

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...