Clojure: получение одного значения и карты в structmap - PullRequest
3 голосов
/ 01 октября 2010

У меня есть последовательность значений, которую я получаю откуда-то еще, в известном порядке.У меня также есть одно отдельное значение.Оба из них я хочу поместить в структуру.Т.е.

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

Теперь у меня есть список

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

, который является результатом регулярного выражения.

Затем я хочу добавить логическое значение в :ited;получая структуру, которая выглядит следующим образом:

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

Как мне это сделать?Я пробовал различные комбинации apply и struct-map.Я добрался до:

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

, но это может быть неправильный способ сделать это вообще.

Ответы [ 3 ]

3 голосов
/ 01 октября 2010

Как насчет:

(def l (list "Name" "Id" "Type"))
(defstruct location :name :id :type :visited)
(assoc
   (apply struct location l)
   :visited true)
3 голосов
/ 01 октября 2010

Вы должны использовать запись, а не структуру, если вы находитесь в 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}
0 голосов
/ 01 октября 2010

Ваша версия выглядит нормально. Один маленький ярлык через 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 тоже бы сработало.

...