我有一系列值,我从其他地方以已知的顺序得到。我也有一个单独的价值。这两个我想放入一个结构。即。
(defstruct location :name :id :type :visited)
现在我有一个清单
(list "Name" "Id" "Type")
这是正则表达式的结果。
然后我想把一个布尔值放入:visited;产生一个如下所示的结构:
{:name "Name" :id "Id" :type "Type" :visited true}
我该怎么做?我尝试了apply和struct-map的各种组合。我得到了:
(apply struct-map location (zipmap [:visited :name :id :type] (cons true (rest match))))
但这可能是错误的解决方法。
答案 0 :(得分:3)
怎么样:
(def l (list "Name" "Id" "Type"))
(defstruct location :name :id :type :visited)
(assoc
(apply struct location l)
:visited true)
答案 1 :(得分:3)
如果你在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}
答案 2 :(得分:0)
您的版本看起来不错。通过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
也会奏效。