如何使用tcl 8.6功能“apply”和“lmap”编写和应用简单的lambda函数?
map (lambda x -> x*x) [list 1 2 3]
如何在Tcl 8.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"
答案 0 :(得分:3)
以下是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
}]
8.6 lmap
在语法上与foreach
类似,因此需要额外的应用层。然而,普通的Tcl程序员更容易理解这一点。
请注意,lambdas是完全的第一类值,可以根据需要传递(放入变量,返回,存储在列表中,等等):
set square [lambda x {$x * $x}]
puts "the square of 42 is [{*}$square 42]"
(如果需要,可以使用λ
作为命令名称,但我觉得在这个键盘上输入很麻烦。我不建议使用\x
; Tcl使用反斜杠进行各种转义职责。)