2017-08-16 51 views
0

這是一個簡化的問題。我試圖將一個過程複製到一個名稱空間,以便它將使用名稱空間自己的上下文。使用進口不工作(可能是因爲它僅僅是創建別名)請參見下面的代碼:將一個proc複製到TCL中的命名空間

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

+0

命名空間手冊頁(http://www.tcl.tk/man/tcl/TclCmd/namespace.htm)表示導入僅適用於導出的命令。您必須導出命令。我試過這個和':: foo :: me_namespace'工作。但是,爲什麼你需要在全局命名空間中導入一個過程? –

+1

看來你正在使用名稱空間來實現某種類型的OOP。你考慮過TclOO嗎? –

回答

1

過程必然包含其命名空間重命名過程,改變它的綁定(我討厭這個!)要在另一個命名空間重新創建一個過程,你必須重命名(移動)或重新運行創建原始的

現在,雖然我真的建議你在使用TclOO的時候可以使用另一種技術,namespace upvar的指令相當快,而y OU也許能夠使用它像這樣:

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 

這些真正的命令別名是相當快的,變量綁定是相當快過(類似速度的global命令;他們在內部使用幾乎相同的字節碼操作),並且您將共享本身相當快的過程編譯。

不這樣做的主要原因是在三種情況下需要不同的命令解析。在這一點上,最快的路線都是通過TclOO(它可以馴服Tcl的一些高級功能以達到可用的目的),並且可能需要對您的部分進行重新設計才能使用得當。

+0

是的,我想到了TCL的OO。但有人要求採用「更簡單」的方式,即通過命名空間。謝謝。 – user1134991

相關問題