为了增强tcl/tk
程序的功能,我想重新实现它的一个原始(名称空间)函数。新的实现应该调用核心功能的原始实现,并添加一些漂亮的东西。将命令重命名为不同的命名空间
这被记录得相当好using tcl's rename
command。
为了让事物尽可能模块化,我想将我的新功能放到一个单独的命名空间中。
我也想避免将东西添加到toobe增强功能的原始名称空间。
所以我们的计划是:
- 重命名
::simple::function
到::enhanced::simple_function
- 创建一个新的
::simple::function
调用::enhanced::simple_function
这个作品都很好,除非原来的函数使用的其他成员公司命名空间没有完全限定他们。
下面是一个例子:
namespace eval ::foospace:: {
proc bar {a} { puts $a }
proc foo {X} { bar "foospace:foo:: $X" }
}
## test original function
::foospace::foo "hello world"
## shadowing the original ::foospace::foo into a new namespace
rename ::foospace::foo ::barspace::foo
proc foospace::foo {x} {
puts "DEBUG: $x"
::barspace::foo "$x"
}
# test enhanced function
::foospace::foo "goodbye moon"
这给了我:
invalid command name "bar" while executing "bar "foospace:foo:: $X" "
如果原始::foospace::foo
使用::foospace::bar
代替bar
,一切工作正常。 不幸的是我不能“修复”原来的实现。
这也将工作,如果我只是改名::foospace::foo
至::foospace::foo_bar
而不是::barspace::foo
但这意味着触及的命名空间不属于我(我想避免)。
有没有办法将我的原始函数重命名为新的名称空间,并允许原函数中的非限定函数名称?
可以说,Tcl目前的行为与程序的重命名是错误的。我会是会争辩的人之一。详细说明请参考 –
thx;我想知道是否有办法获得给定过程的代码(文本)表示,并将所有符号解析为该过程所使用的任何名称空间(当前)......然后可将其作为功能相同的“相同”替代。 –
无论如何,我不认为我想在这里做OO(即使我更喜欢在更一般的水平)。 –