Tcl:使用tcl 8.6编写lambda和map

时间:2013-05-11 05:12:47

标签: tcl

如何使用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"

1 个答案:

答案 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使用反斜杠进行各种转义职责。)