ансамбль
Имя
itcl::ensemble — создание или изменение составной командыСинтаксис
itcl::ensemble ensName ?command arg arg...?или
ensemble ensName {
part partName args body
...
ensemble partName {
part subPartName args body
part subPartName args body
...
}
}
Описание
Команда ensemble используется для создания или изменения составной команды. См. раздел ЧТО ТАКОЕ АНСАМБЛЬ? ниже для краткого обзора ансамблей.Если команда ensemble находит существующий ансамбль с именем ensName, она обновляет этот ансамбль. В противном случае она создаёт ансамбль с именем ensName. Если ensName — это простое имя, например "foo", то команда ансамбля с именем "foo" добавляется в текущий контекст пространства имён. Если команда с именем "foo" уже существует в этом контексте, она удаляется. Если ensName содержит квалификаторы пространства имён, такие как "a::b::foo", то путь к пространству имён разрешается, и команда ансамбля добавляется в этот контекст пространства имён. Родительские пространства имён, такие как "a" и "b", создаются автоматически, при необходимости.
Если ensName содержит пробелы, такие как "a::b::foo bar baz", то дополнительные слова, такие как "bar" и "baz", обрабатываются как под-ансамбли. Под-ансамбли — это всего лишь части внутри ансамбля; у них нет связанной с ними Tcl-команды. Ансамбль, например, "foo", может иметь под-ансамбль под названием "foo bar", который, в свою очередь, может иметь под-ансамбль под названием "foo bar baz". В этом случае под-ансамбль "foo bar" должен быть создан до под-ансамбля "foo bar baz", который находится внутри него.
Если после ensName есть какие-либо аргументы, то они обрабатываются как команды и выполняются для обновления ансамбля. В этом контексте распознаются следующие команды: part и ensemble.
Команда part определяет новую часть для ансамбля. Её синтаксис идентичен обычной команде proc, но она определяет часть внутри ансамбля, а не Tcl-команду. Если часть с именем partName уже существует внутри ансамбля, то команда part возвращает ошибку.
Команда ensemble может быть вложена внутрь другой команды ensemble для определения под-ансамбля.
Что такое ансамбль?
Обычная команда "info" — это составная команда — имени команды info должно следовать подкоманда, например, body или globals. Мы будем называть команду, такую как info, ансамблем, а подкоманды, такие как body или globals, — его частями.Ансамбли могут быть вложены. Например, команда info имеет ансамбль info namespace внутри него. Этот ансамбль имеет части, такие как info namespace all и info namespace children.
С помощью ансамблей составные команды могут быть созданы и расширены автоматическим способом. Любой пакет может найти существующий ансамбль и добавить к нему новые части. Таким образом, авторы расширений могут добавить свои собственные части, например, к команде info.
Модуль ансамблей управляет всеми именами частей и отслеживает уникальные сокращения. Обычно вы можете сократить info complete до info comp. Но если расширение добавит часть info complexity, то минимальное сокращение для info complete станет info complet.
Модуль ансамблей не только автоматизирует построение составных команд, но и автоматизирует обработку ошибок. Если вы вызываете команду ансамбля без указания имени части, вы получите автоматически сгенерированное сообщение об ошибке, которое обобщает информацию об использовании. Например, при вызове команды info без каких-либо аргументов она выводит следующее сообщение об ошибке:
wrong # args: should be one of... info args procname info body procname info cmdcount info commands ?pattern? info complete command info context info default procname arg varname info exists varName info globals ?pattern? info level ?number? info library info locals ?pattern? info namespace option ?arg arg ...? info patchlevel info procs ?pattern? info protection ?-command? ?-variable? name info script info tclversion info vars ?pattern? info which ?-command? ?-variable? ?-namespace? name
Вы также можете настроить способ реагирования ансамбля на ошибки. Когда ансамбль сталкивается с неуказанным или неоднозначным именем части, он ищет часть под названием @error. Если она существует, она используется для обработки ошибки. Эта часть получит все аргументы в командной строке, начиная с имени проблемной части. Она может найти другой способ разрешения команды или сгенерировать собственное сообщение об ошибке.
Пример
Мы могли бы использовать ансамбль для очистки синтаксиса различных команд "wait" в Tcl/Tk. Вместо использования серии странных команд, таких как эта:vwait x tkwait visibility .top tkwait window .
мы могли бы использовать команды с единообразным синтаксисом, например, такие:
wait variable x wait visibility .top wait window .
Пакет Tcl мог бы определить следующий ансамбль:
itcl::ensemble wait part variable {name} {
uplevel vwait $name
} Пакет Tk мог бы добавить некоторые опции к этому ансамблю с помощью команды, подобной этой:
itcl::ensemble wait {
part visibility {name} {
tkwait visibility $name
}
part window {name} {
tkwait window $name
}
} Другие расширения тоже могли бы добавить свои собственные части к команде wait.
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/ensemble.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/ensemble.htm