gpt4 book ai didi

Tcl 匿名函数

转载 作者:行者123 更新时间:2023-12-04 03:00:04 28 4
gpt4 key购买 nike

关于 Tcl 的纯理论问题。

关注 this question我在思考在 Tcl 中实现匿名函数的最佳方式是什么。

最终结果应该是允许开发人员将完整的 proc 作为参数传递给 anohter proc:

do_something $data {proc {} {input} {
puts $input;
}};

这将类似于 javascript 的
do_something(data, function (input) {
alert(input);
});

现在,这自然不会在 OOTB 中起作用。我在想这样的事情:
proc do_something {data anon_function} {
anon_run $anon_function $data
}
proc anon_run {proc args} {
set rand proc_[clock clicks];
set script [lreplace $proc 1 1 $rand];
uplevel 1 $script;
uplevel 1 [concat $rand $args];
uplevel 1 rename $rand {}; //delete the created proc
}

这有效。但是我希望得到关于更好模式的建议,因为它不是很优雅并且没有真正使用很酷的 Tcl 功能。大多数情况下,我想摆脱手动调用 anon_run .

最佳答案

在 Tcl 8.5 中,您可以使用 apply 命令。

proc do_something {data anon_function} {
apply $anon_function $data
}
do_something $data {{input} {
puts $input
}}

当然,如果您将回调构建为命令前缀(推荐!),那么您可以这样做:
proc lambda {arguments body} {
# We'll do this properly and include the optional namespace
set ns [uplevel 1 namespace current]
return [list ::apply [list $arguments $body $ns]]
}

proc do_something {data command} {
{*}$command $data
}

do_something $data [lambda {input} {
puts $input
}]

如果您使用的是 8.4 或更低版本,则需要 code from the Tcler's Wiki作为替代品,但请注意,这些解决方案仅在语义上等效(充其量);它们不是性能等效的。

关于Tcl 匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3235128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com