2010-06-16 66 views
4
我有理解這些功能是如何更新基礎ref上的問題

,原子等交換!改變和相似

的文檔說: (施加電流 - 值的身份˚F參數)

(def one (atom 0)) 
(swap! one inc) ;; => 1 

所以我想知道它是如何「擴大」到申請表。沒有提到申請表中的「參數」究竟是什麼。它是一系列參數還是這些單獨的值?

是它 「擴大」 到:

(apply inc 0) ; obviously this wouldnt work, so that leaves only one possibility 
(apply inc 0 '()) 


(swap! one + 1 2 3) ;; #=> 7 

是不是:

(apply + 1 1 2 3 '()) ;or 
(apply + 1 [1 2 3]) 

(def two (atom [])) 
(swap! two conj 10 20) ;; #=> [10 20] 

是不是:

(apply conj [] [10 20]) ;or 
(apply conj [] 10 20 '()) 

回答

6

swap!的文檔字符串中引用的通道意味着什麼恰好相當於用舊的換取原子的新值,其中args是傳遞給swap!的所有附加參數的一個序列。

實際發生的情況不同,但這只是一個實現細節。爲了好奇:原子有一個名爲swap的Java方法,它被重載以獲取一個到四個參數。第一個是IFnf傳遞給swap!);第二個和第三個,現在,這是IFn的前兩個額外的論據;第四,如果存在的話,是除前兩個之外的額外論點的ISeqapply永遠不會涉及,固定宗教案件甚至不稱爲IFnapplyTo方法(他們只是使用invoke)。這可以在不會將太多額外參數傳遞給swap!的常見情況下提高性能。