Функциональное программирование в Clojure
Гуру
Вот вам вопрос: я работаю над программой clojure, которая включает в себя передачу функций функциям.
У меня есть что-то вроде:
(defn funct-op [args]
((first args)
(second args)
(last args) )
(funct-op '(+ 2 2))
Как я могу уговорить funct-op дать мне 4 вместо того, чтобы 2 я есть в данный момент получаете? Возможно, мне потребуется передать функцию макросу в качестве моей ход проекта. Есть какие-нибудь советы, как это сделать? Спасибо за вашу помощь!
3 ответа:
Чтобы превратить '+' в функцию, вы можете использовать resolve. Это должно работать на основных функциях, но может потребоваться NS-resolve для пользовательских функций. Затем вы можете использовать apply для передачи остальных аргументов этой функции.
Не уверен, какова ваша конечная цель на самом деле, но я думаю, что это ответ, который вы искали.
(defn funct-add [args] (apply (resolve (first args)) (rest args)))
Что такое
funct-add
действительно должен делать? Что, если это было(funct-add '(- 2 2))
?В любом случае, рассмотрим применить , даже завернутый:
(defn apply-wrapper [args] (apply (first args) (rest args))) ; note use of of the [...] form (apply-wrapper [+ 2 2]) ; => 4 (apply-wrapper [- 2 2]) ; => 0
Сравнение этих форм может быть поучительным:
Обратите внимание, как был оценен последний; это не просто "буквальный список" - там больше нет символа! :- )(+ 1 2) ; 3 '(+ 1 2) ; (+ 1 2) [+ 1 2] ; [#<core$_PLUS_ clojure.core$_PLUS_@a8bf33> 1 2]
Счастливое кодирование.