2017-01-14 43 views
0

我试图给this脚本添加一些修改。这种方法是: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

我有一个工作大写的函数,但我无法创建更新的地图的另一个列表。在这个功能中实现这个最好的方法是什么?

回答

0

我终于找到了一个办法,不知道这是否是虽然

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

可以缩写'myfunc'因此最好的办法:'(DEFN MYFUNC [M](更新玛:名字大写))'。 – Thumbnail