Установите 2 переменные по умолчанию в процедуре tcl

При определении процедуры в tcl, подобной приведенной ниже, как я могу вызвать процедуру, определяющую только a и c? Есть какой-либо способ сделать это?

proc test1 { a {b 2} {c 3} } {
   puts "$a $b $c"
}

person Ericson    schedule 14.06.2016    source источник
comment
Неа. Вы не можете пропустить аргумент.   -  person Dinesh    schedule 14.06.2016
comment
Есть ли способ предоставить 2 или более значений по умолчанию, какими бы они ни были?   -  person Ericson    schedule 14.06.2016


Ответы (2)


Вот одна техника, немного сложнее, чем вы надеетесь, но не слишком запутанная:

proc test1 { args } {
    # set the default values
    array set values {b 2 c 3}

    # todo: validate that $args is a list with an even number of items

    # now merge in the args
    array set values $args

    # and do stuff with the values ...
    parray values
}

test1 a 10 c 14

Иногда вы видите, что приложения используют эту технику, когда ключи массива имеют дефис в начале, чтобы выглядеть как параметры:

proc test1 args {
    array set values {-b 2 -c 3}
    array set values $args
    parray values
}

test1 -a 10 -c 14
person glenn jackman    schedule 14.06.2016
comment
В случае необходимости, a может быть обязательным параметром при использовании {a args}. Если кто-то по-прежнему хочет, чтобы a появился в values, используйте (например,) array set values [list a $a b 2 c 3]. - person Peter Lewerin; 14.06.2016

Спасибо, Гленн и Питер, я присоединился к вашим сообщениям и получил

proc test1 { a args } {
    array set valores [list a $a  -b 2 -c 3]
    array set valores $args
    puts "$valores(a) $valores(-b) $valores(-c)" 
}

который решил то, что я хотел.

Итак, теперь я могу позвонить

> proc 12 -c 8
> 12 2 8
person Ericson    schedule 14.06.2016