Clojure 更新列表中的地图
Clojure update maps in a list
我正在尝试对 this 脚本进行一些修改。这个方法给出:
(defn- emit-class!
[[class fields]]
(let [vals {:view? (:view? class)
:type (if (:view? class) "View" "Object")
:package (:package class)
:name (str (:dollar-name class) Icepick/SUFFIX)
:target (:dotted-name class)
:parent (if-let [parent (:qualified-parent-name class)]
(str parent Icepick/SUFFIX)
(if (:view? class) "View" "Object"))
:fields fields}
file-name (str (:package class) "." (:dollar-name class) Icepick/SUFFIX)
file-object (file-object file-name (:element class))]
(doto (.openWriter file-object)
(.write (mustache/render-string template vals))
(.flush)
(.close))))
据我了解,这段代码 fields
是一个包含地图的列表。如果我用
打印内容
(doseq [fff fields
[k v] fff]
(info (str k " " fff)))
然后我得到这个内容
{
:name "counterAlt",
:enclosing-class
{
:package "com.some.package",
:dotted-name "DemoPresenter",
:dollar-name "DemoPresenter",
:annote (#object[com.sun.tools.javac.code.Attribute$Compound 0x6054b6e "@com.Bla"]),
:elem #object[com.sun.tools.javac.code.Symbol$ClassSymbol 0x21312e84 "com.evernote.android.common.demo.DemoPresenter"],
:view? false,
:qualified-parent-name nil
},
:bundler false,
:method "Int"
}
我想做的是向 vals
变量添加另一个名为 fieldsCapitalize
的值,其中列表中的地图完全相同,但只有 name
大写。在此示例中,counterAlt
应变为 CounterAlt
。
我有一个营运资金功能,但我无法使用更新后的地图创建另一个列表。在此功能中实现此目的的最佳方法是什么?
我终于找到了一个方法,但不确定它是否是最好的方法
(defn capitalize [s]
(if (> (count s) 0)
(str (Character/toUpperCase (.charAt s 0))
(subs s 1))
s))
(defn myfunc [m] (assoc m :name (capitalize (get m :name))))
(defn- emit-class!
[[class fields]]
(let [vals {:view? (:view? class)
:type (if (:view? class) "View" "Object")
:package (:package class)
:name (str (:dollar-name class) Icepick/SUFFIX)
:target (:dotted-name class)
:parent (if-let [parent (:qualified-parent-name class)]
(str parent Icepick/SUFFIX)
(if (:view? class) "View" "Object"))
:fields fields
:cap (map myfunc fields)}
file-name (str (:package class) "." (:dollar-name class) Icepick/SUFFIX)
file-object (file-object file-name (:element class))]
(doto (.openWriter file-object)
(.write (mustache/render-string template vals))
(.flush)
(.close))))
我正在尝试对 this 脚本进行一些修改。这个方法给出:
(defn- emit-class!
[[class fields]]
(let [vals {:view? (:view? class)
:type (if (:view? class) "View" "Object")
:package (:package class)
:name (str (:dollar-name class) Icepick/SUFFIX)
:target (:dotted-name class)
:parent (if-let [parent (:qualified-parent-name class)]
(str parent Icepick/SUFFIX)
(if (:view? class) "View" "Object"))
:fields fields}
file-name (str (:package class) "." (:dollar-name class) Icepick/SUFFIX)
file-object (file-object file-name (:element class))]
(doto (.openWriter file-object)
(.write (mustache/render-string template vals))
(.flush)
(.close))))
据我了解,这段代码 fields
是一个包含地图的列表。如果我用
(doseq [fff fields
[k v] fff]
(info (str k " " fff)))
然后我得到这个内容
{
:name "counterAlt",
:enclosing-class
{
:package "com.some.package",
:dotted-name "DemoPresenter",
:dollar-name "DemoPresenter",
:annote (#object[com.sun.tools.javac.code.Attribute$Compound 0x6054b6e "@com.Bla"]),
:elem #object[com.sun.tools.javac.code.Symbol$ClassSymbol 0x21312e84 "com.evernote.android.common.demo.DemoPresenter"],
:view? false,
:qualified-parent-name nil
},
:bundler false,
:method "Int"
}
我想做的是向 vals
变量添加另一个名为 fieldsCapitalize
的值,其中列表中的地图完全相同,但只有 name
大写。在此示例中,counterAlt
应变为 CounterAlt
。
我有一个营运资金功能,但我无法使用更新后的地图创建另一个列表。在此功能中实现此目的的最佳方法是什么?
我终于找到了一个方法,但不确定它是否是最好的方法
(defn capitalize [s]
(if (> (count s) 0)
(str (Character/toUpperCase (.charAt s 0))
(subs s 1))
s))
(defn myfunc [m] (assoc m :name (capitalize (get m :name))))
(defn- emit-class!
[[class fields]]
(let [vals {:view? (:view? class)
:type (if (:view? class) "View" "Object")
:package (:package class)
:name (str (:dollar-name class) Icepick/SUFFIX)
:target (:dotted-name class)
:parent (if-let [parent (:qualified-parent-name class)]
(str parent Icepick/SUFFIX)
(if (:view? class) "View" "Object"))
:fields fields
:cap (map myfunc fields)}
file-name (str (:package class) "." (:dollar-name class) Icepick/SUFFIX)
file-object (file-object file-name (:element class))]
(doto (.openWriter file-object)
(.write (mustache/render-string template vals))
(.flush)
(.close))))