K Combinator in Tcl
比如,用list
模拟 Stack 的 pop 操作。
# stack pop
set stack [list 1 2 3]
set stack [lreplace $stack 0 0]
根据Tcl的内部实现机制:
- Tcl内部通过引用计数进行内存管理
- 变量
$stack
作为参数传递给lreplace
时,其引用计数会 +1 - 通常
lreplace
在修改$stack
的值之前需要先复制一份其内容 lreplace
针对$stack
引用计数为1的情况不进行内容复制- 要是可以在
$stack
变量传递给lreplace
之前减少它的引用计数就好了
于是人们想到下面这种操作:
# stack pop
set stack [list 1 2 3]
set stack [lreplace \
[lindex
[list $stack [set stack ""]] \
0] \
0 0]
关键的地方是set stack ""
减少(抵消)了对变量$stack
的引用。
proc K {x args} {
return $x
}
# stack pop
set stack [list 1 2 3]
set stack [lreplace [K $stack [set stack ""]] 0 0]
# stack pop
set stack [list 1 2 3]
set stack [lreplace $stack[set stack ""] 0 0]