Функциональное программирование с Clojure - PullRequest
3 голосов
/ 26 октября 2011

гуру

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

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

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

(funct-op '(+ 2 2))

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

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

Чтобы превратить «+» в функцию, вы можете использовать функцию разрешения.Это должно работать с основными функциями, но вам может понадобиться ns-resolv для пользовательских функций.Затем вы можете использовать apply, чтобы передать остальные аргументы этой функции.

(defn funct-add [args] (apply (resolve (first args)) (rest args)))

Не уверен, какова ваша конечная цель на самом деле, но я думаю, что это ответ, который вы искали.

4 голосов
/ 26 октября 2011

Что 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]

Обратите внимание, как оценивался последний; это не просто «буквальный список» - там больше нет символов! : -)

Удачного кодирования.

1 голос
/ 26 октября 2011

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

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

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