2

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

1 回答 1

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.6lmap在语法上类似于foreach,因此需要额外的应用层。然而,普通的 Tcl 程序员更容易理解这种情况。

请注意,lambda 是完全一流的值,可以随意传递(放入变量、返回、存储在列表中,等等):

set square [lambda x {$x * $x}]

puts "the square of 42 is [{*}$square 42]"

(如果需要,您可以使用λ命令名称,但我觉得在此键盘上打字很尴尬。但我不建议使用\x;Tcl 使用反斜杠来执行各种转义任务。)

于 2013-05-11T08:35:01.143 回答