Tcl 匿名函数
关于 Tcl 的纯理论问题。
在这个问题之后,我正在思考什么是最好的在Tcl中实现匿名函数的方法。
最终结果应该是允许开发人员将完整的过程作为参数传递给另一个过程:
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
。
A Purely theoretical question on Tcl.
Following this question I was thinking on what would be the best way to implement anonymous functions in Tcl.
The end result should be allowing a developer to pass a full proc as an argument to anohter proc:
do_something $data {proc {} {input} {
puts $input;
}};
which would be similar to javascript's
do_something(data, function (input) {
alert(input);
});
now, naturally this will not work OOTB. I was thinking on something of this sort:
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
}
This works. But I was hoping to get suggestions for a better pattern then this, as it's not very elegant and not really using cool Tcl features. Mostly I'd like to get rid of manually calling anon_run
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 Tcl 8.5 中,您可以使用
apply
< /a> 命令。当然,如果您将回调构造为命令前缀(推荐!),那么您可以这样做:
如果您使用的是 8.4 或之前版本,则需要 来自 Tcler 维基的代码 作为替代,但请注意,这些解决方案仅在语义上等效(充其量);它们的性能并不等同。
In Tcl 8.5, you can use the
apply
command.Of course, if you're structuring your callbacks as command prefixes (recommended!) then you can do this:
If you're using 8.4 or before, you need the code from the Tcler's Wiki as a substitute, but be aware that those solutions are only semantically equivalent (at best); they're not performance-equivalent.