代码之家  ›  专栏  ›  技术社区  ›  Kurt Schelfthout

Clojure:在结构图中获取单值和映射

  •  3
  • Kurt Schelfthout  · 技术社区  · 14 年前

    我有一系列的值,这些值是以已知的顺序从其他地方得到的。我还有一个单独的值。这两个我都想放入一个结构中。即。

    (defstruct location :name :id :type :visited)
    

    现在我有一个清单

    (list "Name" "Id" "Type")
    

    这是regexp的结果。

    然后我想将一个布尔值放入:visited;生成一个如下所示的结构:

    {:name "Name" :id "Id" :type "Type" :visited true}
    

    我该怎么做?我尝试了应用和结构图的各种组合。我做到了:

    (apply struct-map location (zipmap [:visited :name :id :type] (cons true (rest match))))
    

    但这可能是完全解决问题的错误方法。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Arthur Edelstein    14 年前

    怎么样:

    (def l (list "Name" "Id" "Type"))
    (defstruct location :name :id :type :visited)
    (assoc
       (apply struct location l)
       :visited true)
    
        2
  •  3
  •   nickik    14 年前

    如果在1.2中,则应使用记录而不是结构。

    (defrecord location [name id type visited])
    
    (defn getLoc [[name type id] visited] (location. name id type visited))
    
    (getLoc (list "name" "type" "id") true)
    #:user.location{:name "name", :id "id", :type "type", :visited true}
    
        3
  •  0
  •   Brian Carper    14 年前

    你的版本看起来不错。一条小捷径通过 into :

    user> (let [match (list "Name" "Id" "Type")]
            (into {:visited true} 
                  (zipmap [:name :id :type] match)))
    {:visited true, :type "Type", :id "Id", :name "Name"}
    

    merge 也会起作用的。