Clojure 使用向量更新记录
如何使用其元素更新记录Clojure 使用向量更新记录,clojure,Clojure,如何使用其元素更新记录 (pprint records) ({:Name "John" :Age 12 :Index 123 :Class_Index} {:Name "Joe" :Age 13 :Index 3 :Class_Index} {:Name "Jon" :Age 14 :Index 4 :Class_Index}) 如何编写一个函数,使class_索引基于age+索引进行更新。同时可以更新记录,以便在运行函数后,输出如下所示 (pprint records) ({:Name
(pprint records)
({:Name "John" :Age 12 :Index 123 :Class_Index}
{:Name "Joe" :Age 13 :Index 3 :Class_Index}
{:Name "Jon" :Age 14 :Index 4 :Class_Index})
如何编写一个函数,使class_索引基于age+索引进行更新。同时可以更新记录,以便在运行函数后,输出如下所示
(pprint records)
({:Name "John" :Age 12 :Index 123 :Class_Index 135}
{:Name "Joe" :Age 13 :Index 3 :Class_Index 16}
{:Name "Jon" :Age 14 :Index 4 :Class_Index 18})
但是,我无法手动键入记录的所有元素,因为它将包含太多的行。你答案中的功能还能用吗?pprint仅用于说明。实际上,我的记录将包含许多元素
从某种意义上讲(def记录(atom[records]),或者我必须遍历占用太多内存的行。有没有更有效的方法 如果您总是要立即更新记录
(def records (atom [(->Record "John" 12 123 nil)
(->Record "Joe" 13 3 nil)
(->Record "Jon" 14 4 nil)]))
(reset! records (map #(assoc % :Class_Index (+ (:Age %) (:Index %)))
@records))
(pprint records)
-> #<Atom@131bf42:
({:Name "John", :Age 12, :Index 123, :Class_Index 135}
{:Name "Joe", :Age 13, :Index 3, :Class_Index 16}
{:Name "Jon", :Age 14, :Index 4, :Class_Index 18})>
或者如果有物品的来源
(def records (atom (source-fn ...)))
在这种情况下,没有内存开销。代码的其余部分将是相同的。请记住,在Clojure的上下文中,记录是构建地图的一种方式(我猜您指的是数据库中的记录)。关于你的问题:
; The database
(def people [
{:Name "John" :Age 12 :Index 123}
{:Name "Joe" :Age 13 :Index 3}
{:Name "Jon" :Age 14 :Index 4}])
; Calculates the class index for a person and returns the updated person
(defn class-index [{:keys [Age Index] :as person}]
(assoc person :Class_Index (+ Age Index)))
; Calculate the class index for all people
(pprint (map class-index people))
; Output
; ({:Name "John", :Age 12, :Class_Index 135, :Index 123}
; {:Name "Joe", :Age 13, :Class_Index 16, :Index 3}
; {:Name "Jon", :Age 14, :Class_Index 18, :Index 4})
我已经编辑了我的问题,请原谅我对我问题的拙劣解释
(def records (atom (source-fn ...)))
; The database
(def people [
{:Name "John" :Age 12 :Index 123}
{:Name "Joe" :Age 13 :Index 3}
{:Name "Jon" :Age 14 :Index 4}])
; Calculates the class index for a person and returns the updated person
(defn class-index [{:keys [Age Index] :as person}]
(assoc person :Class_Index (+ Age Index)))
; Calculate the class index for all people
(pprint (map class-index people))
; Output
; ({:Name "John", :Age 12, :Class_Index 135, :Index 123}
; {:Name "Joe", :Age 13, :Class_Index 16, :Index 3}
; {:Name "Jon", :Age 14, :Class_Index 18, :Index 4})