info
-
Имя
- info — Возвращает информацию о состоянии интерпретатора Tcl
- Синтаксис
- Описание
-
info args procname
- info body procname
- info class subcommand class ?arg ...
- info cmdcount
- info commands ?pattern?
- info complete command
- info coroutine
- info default procname arg varname
- info errorstack ?interp?
- info exists varName
- info frame ?number?
-
тип
-
источник
- процедура
- eval
- скомпилированный
- процедура
-
источник
- строка
- файл
- команда
- процедура
- лямбда
- уровень
- info body procname
- info functions ?pattern?
- info globals ?pattern?
- info hostname
- info level ?number?
- info library
- info loaded ?interp?
- info locals ?pattern?
- info nameofexecutable
- info object subcommand object ?arg ...
- info patchlevel
- info procs ?pattern?
- info script ?filename?
- info sharedlibextension
- info tclversion
- info vars ?pattern?
-
info class call class method
- info class constructor class
- info class definition class method
- info class destructor class
- info class filters class
- info class forward class method
- info class instances class ?pattern?
- info class methods class ?options...?
-
-all
- -private
- info class methodtype class method
- info class mixins class
- info class subclasses class ?pattern?
- info class superclasses class
- info class variables class
- info class constructor class
-
info object call object method
- info object class object ?className?
- info object definition object method
- info object filters object
- info object forward object method
- info object isa category object ?arg?
-
info object isa class object
- info object isa metaclass object
- info object isa mixin object class
- info object isa object object
- info object isa typeof object class
- info object isa metaclass object
- info object methods object ?option...?
-
-all
- -private
- info object methodtype object method
- info object mixins object
- info object namespace object
- info object variables object
- info object vars object ?pattern?
- info object class object ?className?
-
info class call class method
- info class constructor class
- info class definition class method
- info class destructor class
- info class filters class
- info class forward class method
- info class instances class ?pattern?
- info class methods class ?options...?
-
-all
- -private
- info class methodtype class method
- info class mixins class
- info class subclasses class ?pattern?
- info class superclasses class
- info class variables class
- info class constructor class
Имя
info — Возвращает информацию о состоянии интерпретатора TclСинтаксис
info option ?Описание
Эта команда предоставляет информацию о различных внутренних компонентах интерпретатора Tcl. Допустимые опции (которые можно сократить) включают:- info args procname
- Возвращает список, содержащий имена аргументов процедуры procname в порядке следования. Procname должно быть именем процедуры Tcl-команды.
- info body procname
- Возвращает тело процедуры procname. Procname должно быть именем процедуры Tcl-команды.
- info class subcommand class ?arg ...
- Возвращает информацию о классе class. Подробное описание subcommand приведено в разделе INTROSPECTION КЛАССОВ ниже.
- info cmdcount
- Возвращает количество всех команд, выполненных в данном интерпретаторе.
- info commands ?pattern?
- Если pattern не указан, возвращает список имён всех Tcl-команд, видимых (т.е. исполняемых без квалифицированного имени) в текущем пространстве имён, включая как встроенные команды, написанные на C, так и процедуры команд, определённые с помощью команды proc. Если pattern указан, возвращаются только имена, соответствующие pattern. Сопоставление осуществляется по тем же правилам, что и для команды string match. pattern может быть квалифицированным именем, например, Foo::print*. То есть, оно может указывать конкретное пространство имён, используя последовательность имён пространств имён, разделённых двойными двоеточиями (::), и может содержать символы подстановочных знаков для указания набора команд в этом пространстве имён. Если pattern является квалифицированным именем, то результирующий список имён команд будет содержать каждое имя с квалификатором указанного пространства имён, и будут возвращены только команды, определённые в указанном пространстве имён.
- info complete command
- Возвращает 1, если command является полной Tcl-командой в том смысле, что в ней нет незакрытых кавычек, фигурных скобок, квадратных скобок или имён элементов массива. Если команда, по-видимому, не является полной, возвращается 0. Эта команда обычно используется в средах ввода команд, ориентированных на строки, для того, чтобы пользователи могли вводить команды, которые занимают несколько строк; если команда не является полной, сценарий может отложить её оценку до тех пор, пока не будут введены дополнительные строки для её завершения.
- info coroutine
- Возвращает имя текущей выполняемой coroutine или пустую строку, если выполняется либо никакая coroutine, либо текущая coroutine была удалена (но ещё не вернулась или не передала управление с момента удаления).
- info default procname arg varname
- Procname должно быть именем Tcl-процедуры, а arg — именем аргумента этой процедуры. Если у arg нет значения по умолчанию, то команда возвращает 0. В противном случае она возвращает 1 и помещает значение по умолчанию arg в переменную varname.
- info errorstack ?interp?
- Возвращает (в форме, легко парсируемой программно) имена функций и аргументы на каждом уровне из стека вызовов последней ошибки в указанном interp или в текущем, если не указано.
Эта форма представляет собой список чётной длины, чередующий токены и параметры. Токены в настоящее время могут быть CALL, UP или INNER, но в будущем могут быть добавлены и другие. CALL указывает на вызов процедуры, и его параметр — соответствующий результат info level 0. UP указывает на сдвиг кадров переменных, созданных командой uplevel или подобной, и относится к предыдущему элементу CALL. Его параметр — смещение уровня. INNER идентифицирует «внутренний контекст», который представляет собой самую внутреннюю атомарную команду или инструкцию байткода, вызвавшую ошибку, вместе с её аргументами, когда они доступны. В то время как CALL и UP позволяют отслеживать сложные пути вызовов, INNER сосредоточивается на нарушающей операции во внутреннем вызове процедуры, доходя до уровня подвыражений.
Эта информация также присутствует в записи -errorstack словаря параметров, возвращаемого 3-аргументной командой catch; info errorstack — удобный способ её извлечения для необработанных ошибок на верхнем уровне в интерактивной оболочке tclsh.
- info exists varName
- Возвращает 1, если переменная с именем varName существует в текущем контексте (как глобальная или локальная переменная) и ей было присвоено значение, в противном случае возвращает 0.
- info frame ?number?
- Эта команда обеспечивает доступ ко всем кадрам стека, даже тем, которые скрыты от команды info level. Если number не указан, эта команда возвращает число, представляющее уровень кадра команды. Это 1, если команда вызвана на верхнем уровне. Если number указан, результат — словарь, содержащий информацию о местоположении команды на уровне number в стеке.
Если number положительный (> 0), то он выбирает определённый уровень стека (1 относится к самой внешней активной команде, 2 — к команде, которую она вызвала, и так далее, до текущего уровня кадра, который относится к самой команде info frame); в противном случае он указывает уровень, относительный к текущей команде (0 относится к текущей команде, то есть самой команде info frame, -1 — к её вызывающей команде и так далее).
Это аналогично тому, как работает команда info level, за исключением того, что эта подкоманда сообщает обо всех кадрах, например, загруженных скриптах, вызовах eval, uplevel и т. д.
Обратите внимание, что для вложенных команд, таких как «foo [bar [x]]», только «x» будет видна командой info frame, вызываемой внутри «x». Это аналогично работе команд info level и отслеживанию стека ошибок.
Результирующий словарь может содержать указанные ниже ключи со значениями, имеющими указанные ниже смыслы:
- type
- Эта запись всегда присутствует и описывает природу расположения команды. Признанные значения — source, proc, eval и precompiled.
- source
- означает, что команда находится в скрипте, загруженном командой source.
- proc
- означает, что команда находится в динамически созданном теле процедуры.
- eval
- означает, что команда выполняется с помощью eval или uplevel.
- precompiled
- означает, что команда находится в предварительно скомпилированном скрипте (загружаемом пакетом tbcload), и дальнейшая информация недоступна.
- line
- Эта запись предоставляет номер строки в скрипте, в котором находится команда. Эта информация отсутствует для типа precompiled. Для типа source этот номер строки отсчитывается от начала файла, а для двух последних типов — от начала скрипта.
- file
- Эта запись присутствует только для типа source. Она предоставляет нормализованный путь к файлу, в котором находится команда.
- cmd
- Эта запись предоставляет строковое представление команды. Обычно это неподставленная форма, однако для команд, которые представляют собой канонически построенный список (например, созданный командой list), выполняемых с помощью eval, это подставленная форма, так как у них нет другого строкового представления. При этом не нарушается свойство каноничности последнего.
- proc
- Эта запись присутствует только в том случае, если команда находится в теле обычной Tcl-процедуры. В этом случае она предоставляет имя этой процедуры.
- lambda
- Эта запись присутствует только в том случае, если команда находится в теле анонимной Tcl-процедуры, т.е. лямбды. В этом случае она предоставляет полное определение данной лямбды.
- level
- Эта запись присутствует только в том случае, если запрошенный кадр имеет соответствующий кадр, возвращённый командой info level. Она предоставляет индекс этого кадра, относительный к текущему уровню (0 и отрицательные числа).
Следует отметить, что для процедур, статически определённых в файлах, расположение команд в их телах будет сообщаться с типом source и абсолютными номерами строк, а не как proc. То же самое относится к процедурам, вложенным в статически определённые процедуры, и скриптам literal eval в файлах или статически определённых процедурах.
В отличие от этого, определения процедур и eval внутри динамически evalируемой среды подсчитывают номера строк относительно начала их скрипта, даже если они могли бы подсчитывать их относительно начала внешнего динамического скрипта. Такой тип номера обычно имеет больший смысл.
Другой способ описания этого поведения заключается в том, что местоположения, основанные на файлах, отслеживаются так глубоко, как это возможно, и когда это невозможно, строки подсчитываются на основе самого маленького возможного eval или тела процедуры, так как этот объём обычно легче найти, чем любой динамический внешний объём.
Синтаксическая форма {*} обрабатывается как eval. То есть, если ей передаётся буквальный аргумент-список, система отслеживает номер строки внутри слов списка, а в противном случае все номера строк подсчитываются относительно начала каждого слова (наименьшего объёма).
- info functions ?pattern?
- Если pattern не указан, возвращает список всех математических функций, которые в настоящее время определены. Если pattern указан, возвращаются только те функции, имена которых соответствуют pattern. Сопоставление определяется по тем же правилам, что и для команды string match.
- info globals ?pattern?
- Если pattern не указан, возвращает список всех имён глобальных переменных, которые в настоящее время определены. Глобальные переменные — это переменные в глобальном пространстве имён. Если pattern указан, возвращаются только те имена, которые соответствуют pattern. Сопоставление определяется по тем же правилам, что и для команды string match.
- info hostname
- Возвращает имя компьютера, на котором выполняется данный вызов. Отметим, что это имя не гарантируется как полное доменное имя хоста. В системах, где компьютеры могут иметь несколько разных имён (как это часто бывает в системах с установленным TCP/IP (DNS) и NetBIOS-based networking,) возвращается имя, подходящее для TCP/IP сети.
- info level ?number?
- Если число не указано, эта команда возвращает число, представляющее уровень стека вызывающей процедуры, или 0, если команда вызвана на верхнем уровне. Если число указано, то результат — список, содержащий имя и аргументы для вызова процедуры на уровне число в стеке. Если число положительное, то оно выбирает определённый уровень стека (1 относится к самой верхней активной процедуре, 2 — к процедуре, которую она вызвала, и так далее); в противном случае оно задаёт уровень относительно текущего уровня (0 относится к текущей процедуре, -1 — к её вызывающей процедуре и так далее). См. команду uplevel для получения дополнительной информации о значении уровней стека.
- info library
- Возвращает имя каталога библиотеки, в котором хранятся стандартные скрипты Tcl. Это фактически значение переменной tcl_library и может быть изменено путём установки переменной tcl_library.
- info loaded ?interp?
- Возвращает список, описывающий все пакеты, которые были загружены в interp с помощью команды load. Каждый элемент списка является подсписком с двумя элементами: именем файла, из которого был загружен пакет, и именем пакета. Для статически загруженных пакетов имя файла будет пустой строкой. Если interp опущено, то информация возвращается для всех пакетов, загруженных в любой интерпретатор в процессе. Чтобы получить список только пакетов в текущем интерпретаторе, укажите пустую строку для аргумента interp.
- info locals ?pattern?
- Если pattern не указан, возвращает список всех имён текущих локальных переменных, включая аргументы текущей процедуры, если таковые имеются. Переменные, определённые с помощью команд global, upvar и variable, не будут возвращены. Если pattern указан, возвращаются только те имена, которые соответствуют pattern. Сопоставление определяется теми же правилами, что и для команды string match.
- info nameofexecutable
- Возвращает полное имя файла исполняемого двоичного файла, из которого был запущен приложение. Если Tcl не смог определить файл, возвращается пустая строка.
- info object subcommand object ?arg ...
- Возвращает информацию об объекте object. subcommandы описаны в разделе ОПРЕДЕЛЕНИЕ ОБЪЕКТОВ ниже.
- info patchlevel
- Возвращает значение глобальной переменной tcl_patchLevel, которая по умолчанию содержит точную версию библиотеки Tcl.
- info procs ?pattern?
- Если pattern не указан, возвращает список всех имён процедур команд Tcl в текущем пространстве имён. Если pattern указан, возвращаются только те имена процедур в текущем пространстве имён, которые соответствуют pattern. Сопоставление определяется теми же правилами, что и для команды string match. Если pattern содержит какие-либо разделители пространств имён, они используются для выбора пространства имён относительно текущего пространства имён (или относительно глобального пространства имён, если pattern начинается с ::) для поиска совпадений; шаблон поиска совпадений рассматривается как часть после последнего разделителя пространства имён.
- info script ?filename?
- Если в данный момент обрабатывается файл скрипта Tcl (т.е. активен вызов Tcl_EvalFile или активен вызов команды source), то эта команда возвращает имя обрабатываемого файла. Если указан filename, то возвращаемое значение этой команды будет изменено на указанное имя на время активного вызова. Это полезно в приложениях с виртуальной файловой системой. В противном случае команда возвращает пустую строку.
- info sharedlibextension
- Возвращает расширение, используемое на этой платформе для имён файлов, содержащих динамические библиотеки (например, .so в Solaris). Если динамические библиотеки не поддерживаются на этой платформе, возвращается пустая строка.
- info tclversion
- Возвращает значение глобальной переменной tcl_version, которая по умолчанию содержит основную и второстепенную версию библиотеки Tcl.
- info vars ?pattern?
- Если pattern не указан, возвращает список всех видимых переменных. Включает локальные и видимые глобальные переменные. Если pattern указан, возвращаются только те имена, которые соответствуют pattern. Сопоставление определяется теми же правилами, что и для string match. pattern может быть квалифицированным именем, например, Foo::option*. То есть, он может указать определённое пространство имён, используя последовательность имён пространства имён, разделённых двойными двоеточиями (::), и может содержать символы подстановочных знаков для указания набора переменных в этом пространстве имён. Если pattern — квалифицированное имя, результирующий список имён переменных имеет каждое соответствующее имя пространства имён, квалифицированное именем пространства имён. Обратите внимание, что видимая переменная может ещё не «существовать», если она не была установлена (например, объявлена, но не установлена командой variable).
Интроспекция классов
Следующие значения subcommand поддерживаются командой info class:- info class call class method
- Возвращает описание реализаций методов, используемых для обеспечения типичного экземпляра реализации метода method класса class (типичные экземпляры — объекты, созданные классом без добавления специфических определений для объекта). Это состоит из списка списков по четыре элемента, где каждый подсписок состоит из слова, описывающего общий тип реализации метода (одно из method для обычного метода, filter для применённого фильтра и unknown для метода, вызываемого как часть обработки неизвестного метода), слова, дающего имя вызываемого метода (которое всегда такое же, как method для типа method и «unknown» для типа unknown), слова, дающего полностью квалифицированное имя класса, который определил метод, и слова, описывающего тип реализации метода (см. info class methodtype).
Обратите внимание, что нет проверки того, используют ли реализации методов next для передачи управления по цепочке вызова.
- info class constructor class
- Эта подкоманда возвращает описание определения конструктора класса class. Определение описывается как список из двух элементов: список аргументов конструктора в формате, подходящем для передачи другому вызову proc или определению метода, и тело конструктора. Если конструктор отсутствует, возвращается пустой список.
- info class definition class method
- Эта подкоманда возвращает описание определения метода method класса class. Определение описывается как список из двух элементов: список аргументов метода в формате, подходящем для передачи другому вызову proc или определению метода, и тело метода.
- info class destructor class
- Эта подкоманда возвращает тело деструктора класса class. Если деструктор отсутствует, возвращается пустая строка.
- info class filters class
- Эта подкоманда возвращает список методов-фильтров, установленных для класса.
- info class forward class method
- Эта подкоманда возвращает список аргументов для метода перенаправления, названного method, установленного для класса class.
- info class instances class ?pattern?
- Эта подкоманда возвращает список экземпляров класса class. Если присутствует необязательный аргумент pattern, он ограничивает список возвращаемых экземпляров теми, которые ему соответствуют по правилам string match.
- info class methods class ?options...?
- Эта подкоманда возвращает список всех публичных (т. е. экспортированных) методов класса class. Можно указать следующие опции, контролирующие, какие именно имена методов возвращаются:
- -all
- Если указан флаг -all, список методов будет включать методы, определённые не только классом, но также родительскими классами и миксинами.
- -private
- Если указан флаг -private, список методов также будет включать приватные (т. е. не экспортированные) методы класса (и родительских классов и миксинов, если также указан -all).
- info class methodtype class method
- Эта подкоманда возвращает описание типа реализации метода method класса class. Когда результатом является method, дополнительная информация может быть получена с помощью info class definition, а когда результатом является forward, дополнительная информация может быть получена с помощью info class forward.
- info class mixins class
- Эта подкоманда возвращает список всех классов, которые были смешаны в класс class.
- info class subclasses class ?pattern?
- Эта подкоманда возвращает список прямых подклассов класса class. Если присутствует необязательный аргумент pattern, он ограничивает список возвращаемых классов теми, которые ему соответствуют по правилам string match.
- info class superclasses class
- Эта подкоманда возвращает список прямых родительских классов класса class в порядке приоритета наследования.
- info class variables class
- Эта подкоманда возвращает список всех переменных, объявленных для класса class (т. е. автоматически присутствующих в методах, конструкторе и деструкторе класса).
ОПРЕДЕЛЕНИЕ ОБЪЕКТОВ
Следующие значения subcommand поддерживаются командой info object:- info object call object method
- Возвращает описание реализаций метода, используемых для реализации метода method объекта object. Это состоит из списка списков по четыре элемента, где каждый подсписок состоит из слова, описывающего общий тип реализации метода (являющегося одним из method для обычного метода, filter для применённого фильтра и unknown для метода, который вызывается как часть обработки неизвестного метода), слова, указывающего имя конкретного вызываемого метода (который всегда совпадает с method для типа method и «unknown» для типа unknown), слова, указывающего, что определяло метод (полное квалифицированное имя класса или литеральную строку object, если реализация метода находится на экземпляре), и слова, описывающего тип реализации метода (см. info object methodtype).
Обратите внимание, что нет проверки, действительно ли реализации методов используют next для передачи управления по цепочке вызова.
- info object class object ?className?
- Если className не указан, эта подкоманда возвращает класс объекта object. Если className присутствует, эта подкоманда возвращает булево значение, указывающее, является ли объект object объектом этого класса.
- info object definition object method
- Эта подкоманда возвращает описание определения метода с именем method объекта object. Определение описывается как список из двух элементов; первый элемент — список аргументов метода в формате, подходящем для передачи в другой вызов proc или определения метода, а второй элемент — тело метода.
- info object filters object
- Эта подкоманда возвращает список методов фильтра, установленных на объекте.
- info object forward object method
- Эта подкоманда возвращает список аргументов для вызова перенаправления метода method, установленного на объекте object.
- info object isa category object ?arg?
- Эта подкоманда проверяет, принадлежит ли объект определённой категории, возвращая булево значение, указывающее, соответствует ли аргумент object критериям категории. Поддерживаемые категории:
- info object isa class object
- Это возвращает, является ли object классом (т.е. экземпляром oo::class или одного из его подклассов).
- info object isa metaclass object
- Это возвращает, является ли object классом, который может создавать классы (т.е. oo::class или подкласс его).
- info object isa mixin object class
- Это возвращает, смешан ли класс class непосредственно в object.
- info object isa object object
- Это возвращает, действительно ли object является объектом.
- info object isa typeof object class
- Это возвращает, является ли class типом object (т.е. является ли object экземпляром class или одного из его подклассов, прямого или косвенного).
- info object methods object ?option...?
- Эта подкоманда возвращает список всех общедоступных (т.е. экспортированных) методов объекта object. Можно указать следующие option, которые контролируют, какие имена методов будут возвращены:
- -all
- Если задан флаг -all, список методов будет включать те методы, которые определены не только объектом, но и классом объекта и смешанными классами, а также суперклассами этих классов.
- -private
- Если задан флаг -private, список методов также будет включать частные (т.е. не экспортированные) методы объекта (и классы, если также задан -all).
- info object methodtype object method
- Эта подкоманда возвращает описание типа реализации метода с именем method объекта object. Когда результатом является method, дополнительную информацию можно получить с помощью info object definition, а когда результатом является forward, дополнительную информацию можно получить с помощью info object forward.
- info object mixins object
- Эта подкоманда возвращает список всех классов, которые были смешаны в объект object.
- info object namespace object
- Эта подкоманда возвращает имя внутреннего пространства имён объекта object.
- info object variables object
- Эта подкоманда возвращает список всех переменных, которые были объявлены для объекта object (т.е. которые автоматически присутствуют в методах объекта).
- info object vars object ?pattern?
- Эта подкоманда возвращает список всех переменных в закрытом пространстве имен объекта object. Если задан необязательный аргумент pattern, это фильтр (в синтаксисе шаблона совпадения строк string match), который ограничивает список возвращаемых переменных. Обратите внимание, что это отличается от списка, возвращаемого info object variables; тот может включать переменные, которые в настоящее время не установлены, тогда как этот может включать переменные, которые не включены автоматически ни одним из методов object (или методов его класса, суперклассов или смешанных классов).
Примеры
Это команда выводит процедуру, пригодную для сохранения в скрипте Tcl:proc printProc {procName} {
set result [list proc $procName]
set formals {}
foreach var [info args $procName] {
if {[info default $procName $var def]} {
lappend formals [list $var $def]
} else {
# Still need the list-quoting because variable
# names may properly contain spaces.
lappend formals [list $var]
}
}
puts [lappend result $formals [info body $procName]]
} Примеры с объектами
Каждый объект обязательно знает, каким является его классом; эта информация тривиально извлекается посредством интроспекции:oo::class create c
c create o
puts [info object class o]
→ prints "::c"
puts [info object class c]
→ prints "::oo::class" Возможности интроспекции можно использовать для выяснения того, какой класс реализует метод и как он определён. Эта процедура показывает это:
proc getDef {obj method} {
foreach inf [info object call $obj $method] {
lassign $inf calltype name locus methodtype
# Assume no forwards or filters, and hence no $calltype
# or $methodtype checks...
if {$locus eq "object"} {
return [info object definition $obj $name]
} else {
return [info class definition $locus $name]
}
}
error "no definition for $method"
} Это альтернативный способ поиска определения; он реализован путём ручного сканирования списка методов по иерархии наследования. Этот код предполагает, что используется только одиночное наследование и что нет сложного использования смешанных классов (в таких случаях использование info object call, как показано выше, является на много проще):
proc getDef {obj method} {
if {$method in [info object methods $obj]} {
# Assume no forwards
return [info object definition $obj $method]
}
set cls [info object class $obj]
while {$method ni [info class methods $cls]} {
# Assume the simple case
set cls [lindex [info class superclass $cls] 0]
if {$cls eq ""} {
error "no definition for $method"
}
}
# Assume no forwards
return [info class definition $cls $method]
} См. также
global, oo::class, oo::define, oo::object, proc, self, tcl_library, tcl_patchLevel, tcl_version
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/info.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/info.htm