gpt4 book ai didi

namespaces - 将 proc 复制到 TCL 中的命名空间

转载 作者:行者123 更新时间:2023-12-04 17:02:14 24 4
gpt4 key购买 nike

这是一个问题的简化案例。我正在尝试将过程复制到命名空间,以便它使用命名空间自己的上下文。使用 import 不起作用(可能是因为它只是创建别名)见下面的代码:

proc me_namespace {} {
puts "namespace is:[namespace current]"
puts "called namespace is:[uplevel 1 namespace current ]"
}
namespace eval foo {} {
me_namespace
puts "Now import"
namespace import ::::me_namespace
me_namespace
}

代码输出为:
namespace is:::
called namespace is:::foo
Now import
namespace is:::
called namespace is:::foo
namespace is:::foo

理想情况下,复制后的 proc me_namespace 第一行输出应该是:
::::me_namespace

有任何想法吗?我唯一能想到的就是将过程定义放在一个文件中,然后读取文件,并使用 eval,但我一直在寻找更优雅的东西。
我不只是使用 uplevel 的原因, 是有时(特别是当使用 variableuplevel 时,运行时间太慢了。TCL 版本是 8.6

最佳答案

过程绑定(bind)到它们包含的命名空间。重命名程序,更改其绑定(bind)。 (我讨厌那样!)要在另一个命名空间中重新创建过程,您实际上必须重命名(移动)或重新运行 proc创造了原始的。

现在,虽然我真的建议您在遇到此类事情时考虑使用 TclOO,但您也许可以使用不同的技术。 namespace upvar命令相当快,您可以像这样使用它:

proc master_version_of_foo {ns args} {
namespace upvar $ns abc local1 def local2
# ... continue with your code in here
}

# Stamp out some copies
namespace eval ::x {}
interp alias {} ::x::foo {} ::master_version_of_foo ::x
namespace eval ::y {}
interp alias {} ::y::foo {} ::master_version_of_foo ::y
namespace eval ::z {}
interp alias {} ::z::foo {} ::master_version_of_foo ::z

这些真正的命令别名非常快,变量绑定(bind)也非常快(与 global 命令的速度相似;它们在内部使用几乎相同的字节码操作)并且您将共享程序的编译,它本身很漂亮快速地。

不这样做的主要原因是如果您在三种情况下需要不同的命令解析。在这一点上,最快的路由都通过 TclOO(它驯服了 Tcl 的相当多的高级功能以使其可用)并且可能需要您进行一些认真的重新设计才能很好地使用。

关于namespaces - 将 proc 复制到 TCL 中的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45710512/

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