Spec-Zone.ru › Tcl/Tk

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 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 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 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 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 — Возвращает информацию о состоянии интерпретатора 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API