Tcl:使用 tcl 8.6 编写 lambda 和 map

标签 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"

最佳答案

这是 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/

相关文章:

python - 所有 Tkinter 事件列表

带有可选参数的 TCL 过程调用

tcl - lappend 向元素添加花括号

TCL proc 和字节码编译 - 链接是什么?

shell - 使用 TCL 的 tk_getOpenFile 压缩多个文件

tcl - 无法理解 TCL 中的上级命令

c++ - 无法将管道的写端作为文件描述符传递

tcl - regsub 匹配为 lindex 索引,针对 irc 控制字符

namespaces - TCL 在应用中使用命名空间

regex - 用正则表达式匹配一个字符串