Функциональное программирование в Clojure


Гуру

Вот вам вопрос: я работаю над программой clojure, которая включает в себя передачу функций функциям.

У меня есть что-то вроде:

(defn funct-op [args]
      ((first args) 
       (second args) 
       (last args)   )

(funct-op '(+ 2 2))

Как я могу уговорить funct-op дать мне 4 вместо того, чтобы 2 я есть в данный момент получаете? Возможно, мне потребуется передать функцию макросу в качестве моей ход проекта. Есть какие-нибудь советы, как это сделать? Спасибо за вашу помощь!

3 3

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]
Обратите внимание, как был оценен последний; это не просто "буквальный список" - там больше нет символа! :- )

Счастливое кодирование.

Я не уверен, эти вещи?

(defn funct-op [f list]
  (apply f list))

(funct-op + '(1 2));=>3