名前空間はプレーンテキストでなければなりません。変数やネストスクリプトなどのメタ要素にすることはできません。例えば。次のような方法はありません。名前空間を可変にすることができます
set ns ::my_ns
set ::my_ns::var1 100
puts ${$ns}var1 <== wrong
puts $$nsvar1 <== wrong
ご確認いただけますか?
名前空間はプレーンテキストでなければなりません。変数やネストスクリプトなどのメタ要素にすることはできません。例えば。次のような方法はありません。名前空間を可変にすることができます
set ns ::my_ns
set ::my_ns::var1 100
puts ${$ns}var1 <== wrong
puts $$nsvar1 <== wrong
ご確認いただけますか?
これは動作します:あなたがこれを行うには$
構文を使用することはできません
% namespace eval my_ns { set var1 100 }
100
% incr ::my_ns::var1
101
% set ns ::my_ns
::my_ns
% puts [set ${ns}::var1]
101
を。これは構文上の制限です。あなたはset
の単一引数形式のようなものを使用する必要があります:
puts [set ${ns}::var1]
しかしプロシージャの内部にある場合は、使用可能なより良いオプションがあります。 namespace upvar
コマンドがうまくこの種のものを扱う:
proc printVariable {ns} {
namespace upvar $ns var1 v
puts $v
}
あなたがオブジェクトシステムをシミュレートするためにこれをやっている場合は、おやめください。代わりに実際のオブジェクトシステムを使用します(Tcl 8.6の組み込み部分として出荷されるTclOOなど)。
'$ {$ ns}'と '$$ ns'はあなたがしようとしていることをしません。 Colinの答えのように '[set $ ns]'を使ってください。 –