如何使用 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"
最佳答案
这是 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 程序员更容易理解这一点。
请注意,lambda完全是一流的值,可以按照您想要的方式传递(放入变量、返回、存储在列表中,等等):
set square [lambda x {$x * $x}]
puts "the square of 42 is [{*}$square 42]"
(如果需要,您可以使用 λ
作为命令名称,但我发现在这个键盘上键入很尴尬。不过,我不建议使用 \x
; Tcl 使用反斜杠来执行各种转义职责。)
关于Tcl:使用 tcl 8.6 编写 lambda 和 map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16493986/