如何使用TCL8.6的" apply“和"lmap”特性编写和应用一个简单的lambda函数?
map (lambda x -> x*x) [list 1 2 3]如何在TCL8.6中编写上述代码?手册页对我来说不是那么不言自明。
也许也是一个更高级的版本,但我想我可以自己弄明白:
lambda y -> map (lambda x -> x*x) y基本上我想改进这个版本:
proc \x {f val} {
set res [apply $f $val]
set res
}
set res [\x {x {expr $x*$x}} 5]
puts "res: $res"这样我就可以写下:
set res [\x {expr $x*$x} 5]
puts "res: $res"发布于 2013-05-11 16:35:01
下面是lambda的样子:
proc lambda {arguments expression} {
list ::apply [list $arguments [list expr $expression]]
}然后我们这样做,注意到{*}是必需的,因为内部的lambda项不能直接是一个命令,而不会导致我们在8.5 (或8.6)中不想有的其他麻烦:
set res [lmap x [list 1 2 3] {
{*}[lambda x {$x * $x}] $x
}]lmap在语法上类似于foreach,因此需要额外的应用层。然而,对于普通的Tcl程序员来说,这样更容易理解。
请注意,lambda是完全一等的值,可以随心所欲地传递(放入变量中,返回,存储在列表中,等等):
set square [lambda x {$x * $x}]
puts "the square of 42 is [{*}$square 42]"(如果您愿意,可以使用λ作为命令名,但我发现在这个键盘上键入很不方便。我不推荐使用\x;Tcl使用反斜杠来实现各种转义任务。)
https://stackoverflow.com/questions/16493986
复制相似问题