Вот код:
>cat /tmp/test_args.tcl
proc t1 {args} {
return $args
}
proc t2 {args} {
puts "t2:[llength $args]"
return
set len [llength $args]
if {$len == 1} {
proc_len_1 [lindex $args 0]
} elseif {$len == 2} {
proc_len_2 [lindex $args 0] [lindex $args 1]
} else {
proc_len_x $args
}
}
set tup3 [t1 1 2 3 4 5 6]
puts "before calling t2:[llength $tup3]"
t2 $tup3
t2 100
t2 100 200
Вот вывод:
>tclsh /tmp/test_args.tcl
before calling t2:6
t2:1
t2:1
t2:2
Я использую TCL 8.6.
Вы можете увидеть это перед вызовом t2 , $ tup3 является списком, но pro c t2 получает $ tup3 как одно единственное значение, поэтому вместо * списка значений pro c t2 получает список списка значений.
Но намерение pro c t2, как видно из кода после «возврата», состоит в том, чтобы иметь дело с различным количеством аргументов и, основываясь на количестве аргументов, делать разные вещи. Теперь вызов t2 с помощью переменной списка и литерала обрабатывается одинаково. Это проблема.
Единственное решение, которое я могу придумать, это изменить
t2 $tup3
на
t2 {*}$tup3
Но у меня есть ограничение: $ tup3 нужно оставайтесь такими же, когда оно передается другому профессионалу c. Например, у меня может быть такой pro c, который также ожидает $ tup3:
proc t3 {arg1} {
}
t3 $tup3
Так что в идеале, если каким-то образом я смогу сделать так, чтобы «args» не переносил значения в список, тогда моя проблема решена. Ну, я знаю, что так работает TCL.
Возможно, я уже ответил на свой вопрос, или я не знаю, что я ищу. Если вы видите, что действительно есть решение, пожалуйста, дайте мне знать.
Спасибо.