【发布时间】:2014-09-25 13:15:43
【问题描述】:
考虑一个结构如下的库:
package provide ::mylib 1.0
namespace eval ::mylib {
namespace export f
proc f { action } {
# pass action around
g $action
}
proc g { action } {
eval $action
}
}
如果我尝试这样使用它,它将无法工作:
....
namespace eval ::user {
set x 10
::mylib::f { puts $x }
}
原因是 $x 在 mylib 中是未知的。我可以这样修复它:
namespace eval ::user {
set x 10
::mylib::f { puts $::user::x }
}
这可行,但是限定 ::mylib::f 参数中的每个变量很尴尬。另一种可能性是将代码包装在另一个命名空间 eval 中:
namespace eval ::user {
set x 10
::mylib::f { namespace eval { puts $x } }
}
更好,但仍然丑陋。如果是 Ruby 或 Perl,我只需将一个闭包传递给 ::mylib::f。 Tcl 的最佳实践是什么?
顺便说一句,我目前正在使用 Tcl 8.3,但希望有可能尽快升级到更新版本,因此欢迎使用 8.3 和更新版本的解决方案。
【问题讨论】:
标签: tcl