Когда $ res = "Таблица не существует", что вернет следующий код?
[list [list {*}$res]]
Ну, во-первых, знайте, что [list {*}…]
- это конструкция, которая возвращает список слов в многоточии (содержимое переменной res
в вашем случае). случается , что в вашем случае чистый эффект - ничто, поскольку входная строка на самом деле также является правильно сформированным списком. Затем он становится единственным аргументом для внешнего list
, и в результате мы получаем список из одного элемента, элемент которого содержит список слов Table
, does
, not
и exist
в указанном порядке. {Table does not exist}
.
Примечания по расширению
Список расширенных словоформ полезен для объединения списков; команда concat
делает нечто подобное (но не идентично; в команде concat
есть некоторые исторические странности). Таким образом, вы бы объединили два списка следующим образом:
set concatenation [list {*}$list1 {*}$list2]
Также обратите внимание, что расширение (введено в Tcl 8.5) имеет истинный синтаксис , что очень необычно в Tcl. {*}
меняет природу следующей замены, так что в результате получается несколько слов вместо одного. Хотя без этого можно обойтись, на самом деле удивительно трудно получить права. Например, без него выше было бы:
set concatenation [eval [linsert $list1 0 list] [lrange $list2 0 end]]
Внедрение расширения значительно сократило количество вызовов до eval
, требуемых в большинстве кодов Tcl (преимущество, поскольку его было трудно писать правильно; многие программисты были пойманы этой сложностью). Это оказалось особенно полезным на практике с командой exec
; это значительно упрощает работу с glob
и auto_execok
:
exec {*}[auto_execok $someCmd] $arg1 {*}[glob *.foo]
# Instead of:
#eval [linsert [auto_execok $someCmd] 0 exec] [linsert [glob *.foo] 0 $arg1]
# Or this _wrong_ version:
#eval exec [auto_execok $someCmd] $arg1 [glob *.foo]
Тьфу. Этот последний был немного изнурительным, чтобы писать в форме без расширения, хотя я знаю, что делаю. (Неправильная версия неправильна, потому что она разваливается, если $arg1
содержит метасимволы Tcl…)