# 2008/12/05 01:20 @ Sean Zhang
参考文章:
下面几个词基本上都是说同样的事情。
函数 f(x) = x+1 和 g(x) = x+1 除了名字不一样,本质上没什么不同。因此有些时候可以忽略掉函数名字表示为 (x) = x+1 。
所以这从概念上类似于
proc "" {args} {
# body
}
# 也因此可以看作
interp alias {} lambda {} proc {}
lambda x {expr {$x+1}}
这样做的问题是只能定义一个lambda,实用价值不是很大。我们需要对不同的匿名函数进行区分。
namespace eval lambda {variable unique 0}
proc lambda {argList body} {
set name ::lambda::cmd[incr ::lambda::unique]
proc $name $argList $body
return $name
}
这个方法通过定义函数来实现,但无法自动释放函数。
关于函数的自动释放,[[http://wiki.tcl.tk/997|Local procedures]] 展示了一种思路,但对lambda来说似乎并不是很有用。
proc lambda {params body} { list ::apply [list $params $body] }
# 返回值是一个list,而不是一个command。这主要用于 -command option
#e.g.
lsort -command [lambda {a b} { ... }] $xs
暂时不知道该怎么称呼,就叫做函数模板吧。
proc curry {args} {
set name [info level 0]
eval [list interp alias {} $name {}] $args
set name
} ;# RS
# e.g.
set func [curry puts 2]
$func
这里的问题仍然是如何方便地释放这些已经定义过的资源