我开始学习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 :(得分:2)
我不确定你是否正在使用正确的示例开始使用clojure。 Clojure favors immutability,你只是试图改变一些东西。
尽管如此,解决你的问题。
我正在使用an atom students
作为函数调用之间的列表状态。
我定义了一个本地函数read-input
,它打印输入消息然后读取该行以进行一点重用。
每个新student
获取conjed到现有的students
列表中,列表会与新列表一起发送。
代码:
(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"}]