Почему cond "кэширует" внутреннюю привязку?

Я создаю транзакцию Datomic с помощью этой функции, которую затем сопоставляю со списком входных ключевых слов:

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

Входные данные для build-all-enum-транзакций:

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

Я получаю следующий результат:

[[: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]]

Как вы можете видеть ,:db.part/ должен выдавать инкрементное число для каждого, но только для каждого из условий 'cond'. Почему это? Похоже, что "cond" закрывает значение и использует его повторно. Благодарю.

1 ответ

Решение

Вы должны использовать d/tempid создать темп во время выполнения. #db/id макрос чтения, который расширяется до темпов при чтении программы, т.е. во время компиляции

Другие вопросы по тегам