添加新对象到列表并显示它们

时间:2013-10-26 13:30:09

标签: clojure

我开始学习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!")
         )

       )

   )

   )

我设法创建了一个新对象,但它总是相同的,我怎么能总是添加一个新对象?如何将它添加到列表中以便稍后显示元素?

1 个答案:

答案 0 :(得分:2)

我不确定你是否正在使用正确的示例开始使用clojure。 Clojure favors immutability,你只是试图改变一些东西。

尽管如此,解决你的问题。

  1. 我正在使用an atom students作为函数调用之间的列表状态。

  2. 我定义了一个本地函数read-input,它打印输入消息然后读取该行以进行一点重用。

  3. 每个新student获取conjed到现有的students列表中,列表会与新列表一起发送。

  4. 代码:

     (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 "guille@email"} 
           {:ime "cacho", :index "pedro", :email "lala"}]