proc rep {name} {
upvar $name n
puts "nm is $n"
}
上記のプロシージャで、' name
' は、' ' という名前のプロシージャに渡されるパラメータrep
です。このプログラムを実行すると、" error : Can't read "n" : no such variable
" が得られました。このエラーの考えられる原因を教えてください。
渡した名前の変数がrep
呼び出しスコープに存在しない場合、このエラー メッセージが生成されます。たとえば、この対話型セッションを tclsh で確認してください…</p>
% proc rep {name} { upvar $name n puts "nm は $n" } % 担当者 foo 「n」を読み取れません: そのような変数はありません % セット foo x バツ % 担当者 foo nm は x
変数が設定されていない場合、変数foo
はおかしな状態になります。upvar
それは実際には存在します (変数のグローバル名前空間のハッシュ テーブルで参照されます) が、内容がないため、存在するかどうかのテストは失敗します。(変数は、どこかにエントリ (つまり、その内容を格納するためのストレージ) があり、そのストレージに値が設定されている場合に存在すると言われます。設定されていない変数は、NULL
その中に C レベルでNULL
このため、Tcl 言語自体は値をまったくサポートしていません。値は存在しないことに相当します。)