Namespaces 将进程复制到TCL中的命名空间

Namespaces 将进程复制到TCL中的命名空间,namespaces,tcl,procedure,meta,Namespaces,Tcl,Procedure,Meta,这是一个问题的简化案例。我试图将一个过程复制到一个名称空间,以便它使用名称空间自己的上下文。使用导入不起作用(可能是因为它只创建别名),请参见下面的代码: proc me_namespace {} { puts "namespace is:[namespace current]" puts "called namespace is:[uplevel 1 namespace current ]" } namespace eval foo {} { me_namespace puts "No

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

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_命名空间第1行输出应为:

::::me_namespace
有什么想法吗?我能想到的唯一一件事是将过程定义放在一个文件中,然后读取该文件,并使用eval,但我正在寻找更优雅的东西。
我之所以不只是使用
uplevel
,是因为有时(特别是将
variable
uplevel
一起使用时)是因为运行时a times太慢了。TCL版本是8.6

过程绑定到其包含的命名空间。重命名该过程,更改其绑定。(我讨厌这样!)要在另一个命名空间中重新创建过程,实际上必须重命名(移动)或重新运行创建原始过程的
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
这些真正的命令别名非常快,变量绑定也非常快(与
全局
命令的速度类似;它们在内部使用几乎相同的字节码操作),并且您将共享过程本身非常快的编译


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

命名空间手册页()指示导入仅对导出的命令有效。您必须导出该命令。我尝试了此操作,并且
::foo::me_namespace
有效。但是为什么需要在全局命名空间中导入过程?似乎您正在使用命名空间实现某种OOP。您考虑过TCLO吗?是的,我考虑过TCL但是有人要求一种“更简单”的方法,即通过名称空间。谢谢。