Как оценить последовательность нечистых функций в Clojure? - PullRequest
11 голосов
/ 22 июня 2010

Как я могу оценить список (нечистых) функций в Clojure?Например:

[#(println "1") #(println "2") #(println "3")]

Ожидаемый результат:

1
2
3

Есть ли способ достичь этого без использования макросов?Что-то вроде (map evaluate fns-seq), может быть?

(это нужно для рисования графики с использованием API Clojure.processing.)

Ответы [ 4 ]

17 голосов
/ 22 июня 2010
user> (let [fs [#(println "1") #(println "2") #(println "3")]]
         (doseq [f fs] (f)))
1
2
3
nil
5 голосов
/ 22 июня 2010

Это будет с нетерпением потреблять весь seq, вызывая все функции для побочных эффектов и возвращая все, что возвращает последний:

(reduce #(%2) nil [#(println :foo) #(println :bar)])
; => prints :foo, then :bar, then returns nil

Если вы хотите сохранить возвращаемые значения, вы можете использовать reductionsвместо этого:

(reductions #(%2) nil [#(println :foo) #(println :bar)])
; => prints :foo, then :bar, then returns (nil nil)

reductions находится в clojure.contrib.seq-utils в Clojure 1.1 и в clojure.core в текущих снимках 1.2.

Обновление: Обратите внимание, чтоreductions возвращает ленивый seq, так что это не улучшение по сравнению с map (примечание: в map вы бы хотели использовать #(%) вместо #(%2)).Я упомянул это здесь в основном для полноты.Фактически, я опубликовал полный ответ для полноты, потому что обычно я бы использовал подход doseq (см. Ответ Брайана).

1 голос
/ 04 января 2013

(apply pcalls [#(println "1") #(println "2") #(println "3")]) делает именно это. Просто будьте осторожны с pcalls 'параллелизмом (следовательно, отсутствием последовательности) и ленивостью.

0 голосов
/ 19 августа 2016

Старый вопрос, я знаю, но есть другой вариант.Вы можете просто invoke функции:

(defn generate-fns [] 
   [#(println "1") #(println "2") #(println "3")]) 

(dorun (pmap (memfn invoke) (generate-fns)))

Это позволяет вам в другом контексте решить, как вы хотели бы выполнять функции (скажем, pmap или * * * * *).upmap например)

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