1

Clojure アトムを使用して何か (投票など) をカウントしている場合は、次のようにできます。

(def votes (atom {}))

(defn vote! [candidate]
  (swap! votes update-in [candidate] (fnil inc 0)))

(vote! "Abraham Lincoln")
(vote! "Abraham Lincoln")
(vote! "Winston Churchill")

votes ;=> {"Abraham Lincoln" 2, "Winston Churchill" 2}

ここでは、update-in最初に検索することなく、指定されたキーで値を適切に変換します。

Datomic で同じことを達成するにはどうすればよいですか? 私はこのようなことをすることができます...

(defn vote! [db candidate]
   (let [[e v] (first (q '[:find ?e ?v 
                           :in $ ?candidate 
                           :where [[?e :name ?candidate]
                                   [?e :votes ?v]] db candidate)
     (transact! conn [{:db/id e :votes (inc v)}]))

しかし、クエリを実行し、値を返し、新しい値で処理する必要があるため、少し面倒です。これを行うためのより慣用的な方法はありますか ( aswap!や などupdate-in)?

4

1 に答える 1