Попробуй это:
B 2 {*}$args
Если немного упростить процедуры:
proc A args {
puts [info level 0]
B $args
}
proc B args {
puts [info level 0]
}
Если мы вызовем A
с некоторыми значениями, B
получит эти значения, упакованные в список. Этот список, будучи отдельным элементом в args
, не подходит для передачи в array set
, так как этой команде нужен список четного размера.
% A a b c d
A a b c d
B {a b c d}
Измените вызов B
на это:
proc A args {
puts [info level 0]
B {*}$args
}
Теперь, если мы вызовем A
, каждый аргумент A
станет отдельным аргументом B
, а $args
теперь можно будет использовать в качестве аргумента array set
.
% A a b c d
A a b c d
B a b c d
Как указывает Нурдгоу, в Tcl 8.4 и более ранних версиях нет синтаксиса {*}
, что означает, что для вызова B
необходимо использовать eval
. Один из способов сделать это
eval [linsert $args 0 B]
но можно также использовать немного менее безопасный (это может привести к потере структуры аргумента)
eval B $args
Tcl 8.4 больше не поддерживается, и есть все основания для обновления до 8.5 или 8.6.
Документация: eval, info, linsert, proc, puts, {*}
person
Peter Lewerin
schedule
16.02.2016
array set
? Поделитесь полным кодом. - person Dinesh   schedule 16.02.2016