Clojure中的Python setdefault函数

Clojure中的Python setdefault函数,clojure,Clojure,我试图在Clojure中做类似的事情: #增加特征/类别对的计数 def incf(self,f,cat): self.fc.setdefault(f,{}) self.fc[f].setdefault(cat,0) self.fc[f][cat]+=1 有人知道吗?首先,您不能在Clojure中变异哈希映射,因此,setdefault没有确切的对应项 但是,如果您想更新一个嵌套映射,增加给定的值(或者设置为1,如果为空),您可以利用这样一个

我试图在Clojure中做类似的事情:

#增加特征/类别对的计数

  def incf(self,f,cat):    
    self.fc.setdefault(f,{})    
    self.fc[f].setdefault(cat,0)    
    self.fc[f][cat]+=1

有人知道吗?

首先,您不能在Clojure中变异哈希映射,因此,
setdefault
没有确切的对应项

但是,如果您想更新一个嵌套映射,增加给定的值(或者设置为1,如果为空),您可以利用这样一个事实,即
clojure.core/get
可以接受一个可选的第三个参数,该参数是默认值(并且
nil
上的
assoc
创建映射):


我认为一个紧密的并行是,它接受一个函数和一些默认参数值,然后返回一个函数,如果使用nil参数调用,该函数将使用默认值:


在这里,我们使用
updatein
更新输入映射中的嵌套值,并使用
fnil
设置默认值0,如果它不存在,则将其递增。

我确实需要更频繁地记住
fnil
。我经常写
(update…#(if%(f%):something))
,这很尴尬。
(defn incf [m cat f]
  (let [val (get-in m [cat f] 0)]
    (assoc-in m [cat f] (inc val))))

(incf {:my-cat {:a 1}} :my-cat :a) ; returns {:my-cat {:a 2}}
(incf {:my-cat {}} :my-cat :a)     ; returns {:my-cat {:a 1}}
(incf {} :my-cat :a)               ; returns {:my-cat {:a 1}}
(defn incf [fc f cat]
  (update-in fc [f cat] (fnil inc 0)))

(incf {} :feature-foo :category-bar)
=> {:feature-foo {:category-bar 1}}