2009-07-23 51 views
7

我有一個叫做show的函數,它顯示了一個消息的對話框。我需要將這個函數映射到alist中的所有項目。但Clojure沒有給我顯示任何消息。我究竟做錯了什麼?爲什麼Clojure根本不執行這個功能?

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

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

回答

5

映射函數實際上並不在集合的每個記憶體上運行映射函數。而是返回一個'lazy-cons'單元格。這看起來很像你的經典單鏈表,它有一個非常重要的區別,每個單元格中的數據在讀取時被計算爲而不是它被定義的時間(該結果當然存儲用於以後的讀取)。所以爲了讓函數實際運行,你必須讀取運行該函數的結果。因爲在這種情況下,你不介意那些只知道它跑的Clojure提供了堪稱一大包裝函數的函數的結果護理

(dorun .... insert your map here ....) 

將創建地圖,讀取結果,並及時扔出來用了浪費存儲器中存儲他們以後。

如果你在哪裏映射一個函數與你想保持的結果然後用doseq代替。

+0

感謝您的詳細解答。所有的列表抽象都是懶惰的嗎?我怎麼知道哪些是哪些,哪些不是? – unj2 2009-07-24 02:03:52

7

map是懶惰的。除非您強制評估,否則將不會評估任何內容。 (dorun (action))或使用doseq而不是map