Clojure обновить карты в списке

Я пытаюсь добавить некоторые изменения в этот скрипт. Данный метод приведен:

(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"
}

То, что я пытаюсь сделать, это добавить другое значение, вызываемое fieldsCapitalizevalsпеременной, где карты в списке точно такие же, но только nameзаглавно. В этом примере counterAltдолжно стать CounterAlt.

У меня есть рабочая функция capitalize, но я не могу создать другой список с обновленными картами. Как лучше всего достичь этого в этой функции?

1 ответ

  1. Я, наконец, нашел способ, не уверен, что это лучший подход, хотя

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