2013-10-26 40 views
0

我開始學習clojure,我被這個東西卡住了,我有一個Java的知識,也許我的方法太類似java,但我真正的問題是 - 我做了一個函數,讓我們用戶鍵入幾個字符串,現在我想當用戶輸入這些字符串來創建一個新的對象,然後將其插入到列表中,以便我可以稍後顯示該列表的元素,該如何完成?我試過...添加新的對象列表並顯示它們

(defn unesi [] 

    (println "Unesite ime i prezime studenta: ") 

    (let [imePrezime (read-line)] 
    (println "Unesite index studenta: ") 
     (let [index (read-line)] 
     (println "Unesite email studenta: ") 
     (let [email (read-line)] 
      (def s1 {:ime imePrezime :index index :email email}) 
      (println "Uspjesno ste unijeli studenta!") 
     ) 

     ) 

    ) 

    ) 

我已成功地使一個新的對象,但它始終是相同的一個,我怎麼能隨時添加一個新的?以及如何將它添加到列表中後,顯示的元素?

+0

石勒然後訪問列表,@議論後GuillermoWinkler的回答針對您的具體問題,你的例子可能不開始是正確的。但從另一個角度來說,如果你以不同的眼光來看,它可能是一個開始的好地方。也許你不需要改變同一個對象。在Clojure中,扔掉不再需要的數據結構並創建一個新的數據結構通常是有意義的。這可能會更容易。一旦Clojure強調不可變數據結構以支持多處理器的有效使用,其結果是可變數據結構難以使用。 – Mars

回答

2

我不知道你是以clojure開頭的,的權利的例子。 Clojure favors immutability,你只是想改變一些東西。

無論如何,解決您的問題。

  1. 我使用an atomstudents函數調用的列表狀態。

  2. 我定義了一個本地函數read-input,它打印輸入消息,然後讀取一行以便重複使用。

  3. 每個新student得到conjed到存在students列表,該列表被用新swaped。

代碼:

(def students (atom [])) 

(defn unesi [] 
    (letfn [(read-input [message] 
      (println message) 
      (read-line))] 
    (let [imePrezime (read-input "Unesite ime i prezime studenta: ") 
      index (read-input "Unesite index studenta: ") 
      email (read-input "Unesite email studenta: ")] 
     (swap! students #(conj % {:ime imePrezime :index index :email email})) 
     (println "Uspjesno ste unijeli studenta!")))) 

可以使用deref操作@

user> @students 
    => [{:ime "guille", :index "3", :email "[email protected]"} 
     {:ime "cacho", :index "pedro", :email "lala"}] 
+0

tnx男人,很好的解釋,它幫助了我很多。 – Shile

相關問題