Ваше описание не совсем понятно. Вы хотите передать список имен глобальных переменных в процедуру, а затем вывести ON или OFF на основе их логического значения?
В настоящее время кажется, что вы просто печатаете значение переменных очень сложным способом.
if {$dinnc_cb} {
puts "$dinnc_cb"
} else {
puts "$dinnc_cb"
}
равно puts $dinnc_cb
, если вы не хотите, чтобы код выдавал ошибку, если значение не может быть интерпретировано как логическое значение.
Если мое понимание верно, попробуйте это:
proc x {varlist} {
foreach varname $varlist {
upvar #0 $varname var
puts "$varname: [lindex {ON OFF} [expr {!$var}]]"
}
}
Упвар создает ссылку из глобальной переменной в $ varname на локальную переменную var. Затем вы можете использовать это для проверки глобальной переменной.
Чтобы включить проверку того, что переменная действительно установлена:
proc x {varlist} {
foreach varname $varlist {
upvar #0 $varname var
if {[info exists var]} {
puts "$varname: [lindex {OFF ON} [string is true -strict $var]]"
} else {
puts "$varname: INDETERMINATE"
}
}
}