clojure疑问句的连接功能

clojure疑问句的连接功能,clojure,Clojure,conj用于(conj coll item),例如(conj{}“Stu”) 但是,我在《编程Clojure》一书第16页中找到了这个例子 (alter visitors conj username) (更改访问者的用户名) 我想(conj访问者用户名)应该是正确的用法。秘密是什么?秘密是alter是一个特殊函数,在ref事务中被调用,它的作用是将ref的当前值作为第一个参数插入作为第二个参数提供的函数中 实际上,带有ref的conj的正常用法是: (conj @visitors usernam

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

但是,我在《编程Clojure》一书第16页中找到了这个例子

(alter visitors conj username) (更改访问者的用户名) 我想(conj访问者用户名)应该是正确的用法。秘密是什么?

秘密是alter是一个特殊函数,在ref事务中被调用,它的作用是将ref的当前值作为第一个参数插入作为第二个参数提供的函数中

实际上,带有ref的conj的正常用法是:

(conj @visitors username)
因此,alter大致翻译如下:

(alter vistors conj username)
=> (ref-set visitors (conj @visitors username))
“秘密”在于alter是一个特殊函数,在ref上的事务中被调用,它的作用是将ref的当前值作为第一个参数插入作为其第二个参数提供的函数中

实际上,带有ref的conj的正常用法是:

(conj @visitors username)
因此,alter大致翻译如下:

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

在Clojure中,宏和高阶函数获取后跟参数的函数,然后通过在提供的参数之前插入上下文相关参数来执行该函数,这种情况并不少见。这使打电话的人的生活变得容易了一点。这样你就可以写:

(alter visitors conj username)
而不是:

(alter visitors #(conj %1 username))

其他一些执行此操作的表单有:
send
doto
updatein
->
alter meta

在Clojure中,宏和高阶函数获取后跟args的函数,然后通过在提供的args之前插入上下文相关的参数来执行该函数并不少见。这使打电话的人的生活变得容易了一点。这样你就可以写:

(alter visitors conj username)
而不是:

(alter visitors #(conj %1 username))

其他一些执行此操作的表单有:
send
doto
updatein
->
alter meta

doto和->与此列表中的其他代码非常不同。它们是重写表单的宏:
(doto x println)
扩展为(大致)
(do(println x)x)
,这与
(send x println)
非常不同。后者是一个包含了你所描述的不太方便的语法的函数。@amalloy:是的,它们是不同的,但我认为这种差异在上下文中并不重要。该约定是语法性的,宏和函数的语法基本相同(这被宣传为Lisp:)的一个优点),因此它适用于宏和函数。doto和->与此列表中的其他选项非常不同。它们是重写表单的宏:
(doto x println)
扩展为(大致)
(do(println x)x)
,这与
(send x println)
非常不同。后者是一个包含了你所描述的不太方便的语法的函数。@amalloy:是的,它们是不同的,但我认为这种差异在上下文中并不重要。该约定是语法性的,宏和函数的语法基本相同(这被宣传为Lisp:)的优点),因此它适用于宏和函数。