3

我有一系列以已知顺序从其他地方获得的值。我也有一个单独的值。我想把这两个都放入一个结构中。IE

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

但这可能是完全错误的做法。

4

3 回答 3

3

怎么样:

(def l (list "Name" "Id" "Type"))
(defstruct location :name :id :type :visited)
(assoc
   (apply struct location l)
   :visited true)
于 2010-09-30T22:29:36.023 回答
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}
于 2010-10-01T00:01:47.207 回答
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也会奏效的。

于 2010-09-30T22:16:46.180 回答