2010-08-01 68 views
1

conj用於(conj coll項)中,例如(conj#{}「Stu」)。clojure問題的聯合功能

但是,我在'Programming Clojure'book page16中找到了這個例子。

 
(alter visitors conj username) 

我猜(conj訪客用戶名)將是正確的用法。什麼祕密?

回答

5

「祕密」是,alter是一個特殊的函數,它在ref的事務中被調用,它具有將ref的當前值作爲第一個參數插入到提供的函數中的效果,作爲其第二個函數論據。

其實正常使用的連詞有裁判會是:

(conj @visitors username) 

因此改變大致翻譯如下:

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

的情況並不少見Clojure中宏和高階函數採用一個函數,接着是args,然後通過在提供的args之前插入一個依賴於上下文的參數來執行它。這使得來電者的生活變得更容易一些。這樣,你可以寫:

(alter visitors conj username) 

代替:

(alter visitors #(conj %1 username)) 

一些其他形式的做到這一點是:senddotoupdate-in->alter-meta!

+0

doto和 - >與此列表中的其他人非常不同。它們是重寫表單的宏:'(doto x println)'擴展到(粗略)'(do(println x)x)',這與'(send x println)'非常不同。後者是一個包含你描述的不太方便的語法的函數。 – amalloy 2011-03-14 06:10:46

+0

@amalloy:是的,他們不同,但我不認爲這種差異在這方面很重要。該約定是語法的,宏和函數的語法基本相同(這被廣告爲Lisp的一個優點:)),所以它適用於宏和函數。 – 2011-03-14 09:28:48