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))))