2010-06-16 56 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!的常见情况下提高性能。