conj用於(conj coll項)中,例如(conj#{}「Stu」)。clojure問題的聯合功能
但是,我在'Programming Clojure'book page16中找到了這個例子。
(alter visitors conj username)
我猜(conj訪客用戶名)將是正確的用法。什麼祕密?
conj用於(conj coll項)中,例如(conj#{}「Stu」)。clojure問題的聯合功能
但是,我在'Programming Clojure'book page16中找到了這個例子。
(alter visitors conj username)
我猜(conj訪客用戶名)將是正確的用法。什麼祕密?
「祕密」是,alter是一個特殊的函數,它在ref的事務中被調用,它具有將ref的當前值作爲第一個參數插入到提供的函數中的效果,作爲其第二個函數論據。
其實正常使用的連詞有裁判會是:
(conj @visitors username)
因此改變大致翻譯如下:
(alter vistors conj username)
=> (ref-set visitors (conj @visitors username))
的情況並不少見Clojure中宏和高階函數採用一個函數,接着是args,然後通過在提供的args之前插入一個依賴於上下文的參數來執行它。這使得來電者的生活變得更容易一些。這樣,你可以寫:
(alter visitors conj username)
代替:
(alter visitors #(conj %1 username))
一些其他形式的做到這一點是:send
,doto
,update-in
,->
,alter-meta!
。
doto和 - >與此列表中的其他人非常不同。它們是重寫表單的宏:'(doto x println)'擴展到(粗略)'(do(println x)x)',這與'(send x println)'非常不同。後者是一個包含你描述的不太方便的語法的函數。 – amalloy 2011-03-14 06:10:46
@amalloy:是的,他們不同,但我不認爲這種差異在這方面很重要。該約定是語法的,宏和函數的語法基本相同(這被廣告爲Lisp的一個優點:)),所以它適用於宏和函數。 – 2011-03-14 09:28:48