Карты обновления 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"
}

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

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


person vRallev    schedule 14.01.2017    source источник


Ответы (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))))
person vRallev    schedule 14.01.2017
comment
Вы можете сократить myfunc таким образом: (defn myfunc [m] (update m :name capitalize)). - person Thumbnail; 14.01.2017