2009-07-23 11 views
7

메시지와 대화 상자를 보여주는 show라는 함수가 있습니다. alist의 모든 항목에이 함수를 매핑해야합니다. 하지만 Clojure는 나에게 어떤 메시지도 보여주지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?왜 Clojure는이 함수를 전혀 실행하지 않습니까?

(defn show[message] 
(. javax.swing.JOptionPane (showMessageDialog nil message))) 

(defn action[] 
    (map show '(HELLO Sweet love))) 

답변

5

map 함수는 실제로 각 구성원의 매핑 된 함수를 실행하지 않습니다. 오히려 그것은 '게으른 단점'셀을 반환합니다. 이것은 하나의 매우 중요한 차이점을 가진 고전적으로 단독으로 링크 된 목록과 비슷하게 보입니다. 각 셀의 데이터는으로 정의 된 시간이 아닌 그 시간에 읽혀지는 시간에 으로 계산됩니다 (이 결과는 나중에 읽도록 ​​저장 됨). 따라서 실제로 함수가 실행되도록하려면 함수를 실행 한 결과를 읽어야합니다. 이 경우 당신은 Clojure에서라는 훌륭한 래퍼 기능을 제공 실행 만하는 함수의 결과에 대해주의를 해달라고하기 때문에

(dorun .... insert your map here ....) 
,지도를 만드는 결과를 읽고 신속하게 밖으로 저장하는 메모리를 낭비 그들을 밖으로 던질 것이다

그들을 위해 나중에.

어디에 계속 유지하려는 결과가있는 함수를 매핑하는 경우 대신에 doseq를 사용하십시오.

+0

자세한 답변을 보내 주셔서 감사합니다. 모든 목록 추상화가 게으른가요? 어느 것이고 어떤 것이 아닌지 어떻게 알 수 있습니까? – unj2

+0

나는 벡터가 (일반적으로 그 문제를 해결하는 끝에 시작하는 초를 만드는 rsec [1 2 3]) 함수를 가지고 있지만 그것들은 모두 반대라는 것을 믿는다. –

7

map은 게으르다. 평가할 때까지 아무 것도 평가되지 않습니다. (dorun (action)) 또는 map 대신 doseq을 사용하십시오.

관련 문제