clojure问题的联合函数

时间:2010-08-01 14:13:50

标签: clojure

conj用于(conj coll item),例如(conj#{}“Stu”)。

但是,我在'Programming Clojure'一书第16页中找到了这个例子。

(alter visitors conj username)

我猜(conj visitor username)将是正确的用法。秘密是什么?

2 个答案:

答案 0 :(得分:5)

“秘密”是alter是一个在ref上的事务中调用的特殊函数,它具有将ref的当前值作为第一个参数插入到作为其第二个参数提供的任何函数的效果

实际上,参与ref的正常用法是:

(conj @visitors username)

因此,大致翻译如下:

(alter vistors conj username)
=> (ref-set visitors (conj @visitors username))

答案 1 :(得分:2)

在Clojure中,宏和高阶函数采用函数后跟args然后通过在提供的args之前插入依赖于上下文的参数来执行它并不罕见。这使得来电者的生活更加轻松。这样你就可以写:

(alter visitors conj username)

而不是:

(alter visitors #(conj %1 username))

执行此操作的其他一些表单包括:senddotoupdate-in->alter-meta!