2010-09-30 7 views
3

J'ai une séquence de valeurs que je reçois d'ailleurs, dans un ordre connu. J'ai aussi une valeur séparée. Ces deux je veux mettre dans une structure. C'est à dire.Clojure: Obtention de valeur unique et mappage dans structmap

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

Maintenant, j'ai une liste

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

qui est le résultat d'une expression rationnelle.

Ensuite, je veux mettre un booléen dans: visité; donnant une structure qui ressemble à ceci:

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

Comment faire? J'ai essayé différentes combinaisons de apply et struct-map. Je suis allé aussi loin que:

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

mais ce n'est peut-être pas la bonne façon de procéder.

Répondre

3

Que diriez-vous:

(def l (list "Name" "Id" "Type")) 
(defstruct location :name :id :type :visited) 
(assoc 
    (apply struct location l) 
    :visited true) 
+0

Oui ... si facile :) –

0

Votre version semble OK. Un petit raccourci via 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 aurait également travaillé.

3

Vous devez utiliser un enregistrement pas struct si vous êtes en 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

+1 pour l'astuce concernant les enregistrements. Je n'aime pas avoir à écrire une fonction spéciale juste pour déstructurer ce cas particulier. Merci! –

+0

Vous n'êtes pas obligé. Je ferais mieux d'obtenir les données sous forme de liste. – nickik

Questions connexes