首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl:使用tcl 8.6编写lambda和map

Tcl:使用tcl 8.6编写lambda和map
EN

Stack Overflow用户
提问于 2013-05-11 13:12:47
回答 1查看 768关注 0票数 2

如何使用TCL8.6的" apply“和"lmap”特性编写和应用一个简单的lambda函数?

代码语言:javascript
复制
map (lambda x -> x*x) [list 1 2 3]

如何在TCL8.6中编写上述代码?手册页对我来说不是那么不言自明。

也许也是一个更高级的版本,但我想我可以自己弄明白:

代码语言:javascript
复制
lambda y -> map (lambda x -> x*x) y

基本上我想改进这个版本:

代码语言:javascript
复制
proc \x {f val} {
    set res [apply $f $val]
    set res
}

set res [\x {x {expr $x*$x}} 5]
puts "res: $res"

这样我就可以写下:

代码语言:javascript
复制
set res [\x {expr $x*$x} 5]
puts "res: $res"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-11 16:35:01

下面是lambda的样子:

代码语言:javascript
复制
proc lambda {arguments expression} {
    list ::apply [list $arguments [list expr $expression]]
}

然后我们这样做,注意到{*}是必需的,因为内部的lambda项不能直接是一个命令,而不会导致我们在8.5 (或8.6)中不想有的其他麻烦:

代码语言:javascript
复制
set res [lmap x [list 1 2 3] {
    {*}[lambda x {$x * $x}] $x
}]

lmap在语法上类似于foreach,因此需要额外的应用层。然而,对于普通的Tcl程序员来说,这样更容易理解。

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

代码语言:javascript
复制
set square [lambda x {$x * $x}]

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

(如果您愿意,可以使用λ作为命令名,但我发现在这个键盘上键入很不方便。我不推荐使用\x;Tcl使用反斜杠来实现各种转义任务。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16493986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档