Передача списка в процедуру 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
}

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