Функциональные литералы Clojure - PullRequest
7 голосов
/ 09 марта 2012

Я делаю Введение в функции Проблема, но я не совсем понимаю, что происходит? Чем отличаются 4 выражения ниже? Если они все одинаковы, зачем использовать 4 разных синтаксиса?

(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))

1 Ответ

18 голосов
/ 09 марта 2012
  • (fn [x] (+ x 5)) и #(+ % 5) - Эти два полностью эквивалентны, последний просто использует макрос отправки , чтобы сделать код немного более кратким.Для коротких функций обычно предпочтительнее синтаксис #(), а синтаксис (fn [x]) лучше для функций, которые немного длиннее.Кроме того, если у вас есть вложенные анонимные функции, вы не можете использовать #() для обеих из-за неоднозначности, которую это может вызвать., кроме того, что имеет имя: add-Five.Иногда это может быть полезно, например, если вам нужно сделать рекурсивный вызов вашей функции. *

  • (partial + 5) - В ближайшем будущем + - это функция с переменным числом аргументов.Это означает, что он может принимать любое количество аргументов.(+ 1 2) и (+ 1 2 3 4 5 6) являются совершенно правильными формами.partial создает новую функцию, идентичную +, за исключением того, что первый аргумент всегда равен 5. Из-за этого ((partial + 5) 3 3 3) допустимо.Вы не можете использовать другие формы в этом случае.

* При выполнении рекурсивного вызова из хвостовой позиции следует использовать recur, однако это не всегда возможно.

...