передача списка в процедуру в tcl - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу передать список в процедуру, но не знаю, как это сделать. Я рассмотрел несколько примеров того, как это сделать, но примеры слишком сложны, и я их не понимаю. Список и порядок действий приведены ниже.

set RS_CheckBoxes [list kl15_cb din1_cb din2_cb din3_cb din4_cb \
                dinnc_cb ain1_cb ain2_cb ain3_cb ain4_cb a_cb \
                b_cb u_cb v_cb w_cb sin_cb cos_cb th1_cb th2_cb hvil_cb]

tk::button .rs.enter -height 2 -text "Enter" -width 10 -command {x $RS_CheckBoxes}

proc x {$RS_CheckBoxes} {

if {$RS_CheckBoxes} {
puts "ON"
} else {
puts "OFF"
}
}

В настоящее время я использую приведенный ниже код, но хочу уменьшить количество строк.

tk::button .relSel.b -height 2 -text "Enter" -width 10 -command {if {$kl15_cb} {
 puts "$kl15_cb"
 } else {
 puts "$kl15_cb"
 }

 if {$dinnc_cb} {
 puts "$dinnc_cb"
 } else {
 puts "$dinnc_cb"
 }

 if {$din1_cb} {
 puts "$din1_cb"
 } else {
 puts "$din1_cb"
 }

 if {......... etc}
 ............. etc

1 Ответ

0 голосов
/ 08 сентября 2018

Ваше описание не совсем понятно. Вы хотите передать список имен глобальных переменных в процедуру, а затем вывести 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"
        }
    }
}
...