【问题标题】:Clojure update maps in a listClojure 更新列表中的映射
【发布时间】:2017-01-14 15:08:48
【问题描述】:

我正在尝试对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"
}

我要做的是将另一个名为fieldsCapitalize 的值添加到vals 变量中,其中列表中的映射完全相同,但只有name 大写。在此示例中,counterAlt 应变为 CounterAlt

我有一个有效的大写函数,但我无法使用更新的地图创建另一个列表。在此功能中实现此目的的最佳方法是什么?

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案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))))
    

    【讨论】:

    • 您可以将myfunc 缩写为:(defn myfunc [m] (update m :name capitalize))
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多