2010-06-21 3 views
11

Clojure에서 (불순한) 함수 목록을 어떻게 평가할 수 있습니까? 예를 들어 :Clojure에서 일련의 불순한 함수를 평가하는 방법은 무엇입니까?

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

예상 출력은 다음과 같습니다 매크로를 사용하지 않고이를 달성 할 수있는 방법이

1 
2 
3 

있습니까? (map evaluate fns-seq)과 같은 것, 아마도?

(나는 Clojure.processing API를 사용하여 일부 그래픽을 그리기 위해이 필요합니다.) 마지막 반환 어떤

답변

17
user> (let [fs [#(println "1") #(println "2") #(println "3")]] 
     (doseq [f fs] (f))) 
1 
2 
3 
nil 
+0

우수함 싶습니다 어떻게 다른 맥락에서 결정할 수 있습니다 . 고마워! –

5

이 부작용에 대한 모든 함수를 호출하고 반환, 전체 서열을 소비 열심히합니다

당신은 반환 값에 유지하려면
(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 1.1에서 clojure.contrib.seq-utilsclojure.core에서 현재 스냅 샷 1.2에 있습니다.

업데이트 :이 map 아무런 개선이 없다, 그래서 reductions가, 게으른 서열을 반환 주 (. NB는 map 당신은 #(%2)보다는 #(%)을 사용할 것). 나는 그것을 완전을 위해 여기에서 주로 언급했다. 실제로, 내가 보통 doseq 접근법을 사용하기 때문에 전체 응답을 게시했습니다 (Brian의 답변 참조).

+0

추가 의견을 보내 주셔서 감사합니다. 나는 명령형 자바 세상에서 도서관을 다룰 때 나의 "문제"가 더 자주 일어날 것이라고 상상할 수있다. 어쩌면 매크로 (dofns fns)가 Clojure에서 빠져있는 좋은 추상화 일 것입니다. –

1

(apply pcalls [#(println "1") #(println "2") #(println "3")]) 그냥 그렇습니다. pcalls '병렬성 (따라서 순차성 부족)과 게으름을 경계하십시오.

+0

pcalls 알아두면 좋네요 :) – nXqd

0

오래된 질문이지만, 다른 옵션이 있습니다. 당신은 할 수 단순히 invoke 기능 :

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

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

이것은 당신이 일이, (말하자면 pmap, 또는 예를 들어 claypoole'supmap) 기능을 실행하기 위해

관련 문제