Передача списка в процедуру Tcl
Каков канонический способ передать список процедуре Tcl?
Мне бы очень понравилось, если бы я смог получить его, чтобы список автоматически расширялся в переменное количество аргументов.
Итак, что-то вроде:
set a {b c}
myprocedure option1 option2 $a
и
myprocedure option1 option2 b c
эквивалентны.
Я уверен, что видел это раньше, но я не могу найти его нигде в Интернете. Любая помощь (и код), чтобы сделать оба эквивалентных случая, была бы оценена.
Является ли это стандартным соглашением Tcl. Или я даже лаю по неправильному дереву?
Ответы
Ответ 1
Это зависит от версии Tcl, которую вы используете, но:
Для 8.5:
set mylist {a b c}
myprocedure option1 option2 {*}$mylist
Для 8.4 и ниже:
set mylist {a b c}
eval myprocedure option1 option2 $mylist
# or, if option1 and 2 are variables
eval myprocedure [list $option1] [list $option2] $mylist
# or, as Bryan prefers
eval myprocedure \$option1 \$option2 $mylist
Ответ 2
Чтобы расширить ответ RHSeeger, вы бы запрограммировали myprocedure специальным аргументом args
следующим образом:
proc myprocedure {opt1 opt2 args} {
puts "opt1=$opt1"
puts "opt2=$opt2"
puts "args=[list $args]" ;# just use [list] for output formatting
puts "args has [llength $args] elements"
}
Ответ 3
Может быть полезно отметить, что передача вашей команды в catch также решит эту проблему:
set a {b c}
if [catch "myprocedure option1 option2 $a"] {
# handle errors
}
Это, вероятно, следует использовать только в том случае, если вы хотите обрабатывать ошибки в моей процедуре на этом этапе вашего кода, чтобы вам не приходилось беспокоиться о том, чтобы переусердствовать с любыми потерянными ошибками.