Estoy intentando agregar algunas modificaciones a este script. Este método se da:

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

Por lo que tengo entendido, este código fields es una lista que contiene mapas. Si imprimo el contenido con

(doseq [fff fields
   [k v] fff]
  (info (str k " " fff)))

Entonces obtengo este contenido

{
: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"
}

Lo que estoy tratando de hacer es agregar otro valor llamado fieldsCapitalize a la variable vals, donde los mapas en la lista son exactamente iguales, pero solo el name está en mayúscula. En esta muestra, counterAlt debería convertirse en CounterAlt.

Tengo una función de capitalización de trabajo, pero no puedo crear otra lista con los mapas actualizados. ¿Cuál es la mejor manera de lograr esto en esta función?

0
vRallev 14 ene. 2017 a las 18:08

1 respuesta

La mejor respuesta

Finalmente encontré una manera, aunque no estoy seguro de si es el mejor enfoque

(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))))
0
vRallev 14 ene. 2017 a las 18:58
1
Puede abreviar myfunc así: (defn myfunc [m] (update m :name capitalize)).
 – 
Thumbnail
14 ene. 2017 a las 22:53