2016-04-26 1 views
1

Je construis transaction Datomic avec cette fonction, que je puis en la plaquant sur une liste de mots clés d'entrée:Pourquoi cond semble « cache » une liaison interne?

(defn build-enum-transaction [inp] 
    (cond 
    (.contains (namespace (first inp)) "region") 
     [:db/add #db/id[:db.part/region] :db/ident (first inp)] 
    (.contains (namespace (first inp)) "sector") 
     [:db/add #db/id[:db.part/sector] :db/ident (first inp)] 
    (.contains (namespace (first inp)) "specialism") 
     [:db/add #db/id[:db.part/specialism] :db/ident (first inp)])) 

(defn build-all-enum-transactions [inp] 
    (vec (map build-enum-transaction inp))) 

Les données d'entrée aux build-all-ENUM transactions est:

([:region/EU] 
[:region/UK] 
[:region/NAFTA] 
[:sector/NON-CYCLICALS] 
[:sector/FINANCIALS] 
[:specialism/INSURANCE] 
[:specialism/VAT]) 

-je obtenir le résultat suivant:

[[:db/add #db/id[:db.part/region -1000289] :db/ident :region/EU] 
[:db/add #db/id[:db.part/region -1000289] :db/ident :region/UK] 
[:db/add #db/id[:db.part/region -1000289] :db/ident :region/NAFTA] 
[:db/add #db/id[:db.part/sector -1000290] :db/ident :sector/NON-CYCLICALS] 
[:db/add #db/id[:db.part/sector -1000290] :db/ident :sector/FINANCIALS] 
[:db/add #db/id[:db.part/specialism -1000291] :db/ident :specialism/INSURANCE] 
[:db/add #db/id[:db.part/specialism -1000291] :db/ident :specialism/VAT]] 

Comme vous pouvez le voir, le : db.part/ devrait donne un nombre incrémentiel pour chacun mais il ne le fait que pour chacune des clauses 'cond'. Pourquoi est-ce? Il semble que le «cond» se referme sur la valeur et la réutilise. Merci.

Répondre

2

Vous devez utiliser d/tempid pour créer un MATR_PROV lors de l'exécution. #db/id est une macro de lecteur qui étendra à un MATR_PROV lors de la lecture du programme, i. e. compiler le temps.