Spec-Zone.ru › Tcl/Tk

tm

НАЗВАНИЕ
tm — Средства для поиска и загрузки модулей Tcl
СИНОПСИС
ОПИСАНИЕ
::tcl::tm::path add ?path...?
::tcl::tm::path remove ?path...?
::tcl::tm::path list
::tcl::tm::roots ?path...?
ОПРЕДЕЛЕНИЕ МОДУЛЯ
ПОИСК МОДУЛЕЙ
ПУТИ ПО УМОЛЧАНИЮ
ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ СИСТЕМЫ
file normalize [info library]/../tclX/X.y
file normalize EXEC/tclX/X.y
ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ САЙТА
file normalize [info library]/../tclX/site-tcl
ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ ПОЛЬЗОВАТЕЛЯ
$::env(TCLX_y_TM_PATH)
$::env(TCLX.y_TM_PATH)
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

tm — Средства для поиска и загрузки модулей Tcl

Синопсис

::tcl::tm::path add ?path...?
::tcl::tm::path remove ?path...?
::tcl::tm::path list
::tcl::tm::roots ?path...?

Описание

Данный документ описывает средства для поиска и загрузки модулей Tcl (см. ОПРЕДЕЛЕНИЕ МОДУЛЯ для определения модуля Tcl). Поддерживаются следующие команды:
::tcl::tm::path add ?path...?
Пути добавляются в начало списка путей модулей в порядке их появления. Это означает, что последний аргумент становится новым началом списка.

Команда накладывает ограничение, что ни один путь не может быть родительским каталогом другого пути в списке. Если какой-либо из новых путей нарушает это ограничение, будет выведено сообщение об ошибке, прежде чем какой-либо из путей будет добавлен. Другими словами, если только один аргумент пути нарушает ограничение, то ни один из них не будет добавлен.

Если путь уже присутствует, ошибка не будет выведена, и никаких действий не будет предпринято.

Пути ищутся позже в порядке их появления в списке. По мере добавления их в начало списка они ищутся в обратном порядке добавления. Другими словами, пути, добавленные последними, рассматриваются в первую очередь.

::tcl::tm::path remove ?path...?
Удаляет пути из списка путей модулей. Команда игнорирует все пути, которые отсутствуют в списке.
::tcl::tm::path list
Возвращает список, содержащий все зарегистрированные пути модулей в порядке их поиска модулей.
::tcl::tm::roots ?path...?
Аналогично команде path add и основана на ней. Эта команда принимает список путей, расширяет каждый из них с помощью “tclX/site-tcl” и “tclX/X.y”, для основной версии интерпретатора Tcl X и второстепенной версии y, меньшей или равной второстепенной версии интерпретатора, и добавляет полученный набор путей в список путей для поиска.

Эта команда используется системой для настройки системно-специфичных путей по умолчанию.

Эта команда была добавлена, чтобы позволить системе сборки определять дополнительные корневые пути, выходящие за рамки описанных в данном документе.

Определение модуля

Модуль Tcl — это пакет Tcl, содержащийся в одном файле и не требующий других файлов. Этот файл должен быть sourceable. Другими словами, модуль Tcl всегда импортируется следующим образом:
source module_file

Команда load напрямую не используется. Это ограничение не является фактическим ограничением, как некоторые могут полагать. С версии 8.4 команда Tcl source считывает только до первого символа ^Z. Это позволяет нам объединить произвольный Tcl-скрипт с произвольными двоичными данными в один файл, где скрипт обрабатывает присоединённые данные, как ему заблагорассудится, полностью импортирует и активирует пакет.

Имя файла модуля должно соответствовать регулярному выражению:

([_[:alpha:]][:_[:alnum:]]*)-([[:digit:]].*)\.tm

Первая группа скобок определяет имя пакета, вторая — его версию. Помимо соответствия шаблону, извлечённое номер версии не должно вызывать ошибку при использовании в команде:

package vcompare $version 0

Поиск модулей

Дерево каталогов для хранения модулей Tcl отделено от других частей файловой системы и независимо от auto_path.

Модули Tcl ищутся во всех каталогах, перечисленных в результате выполнения команды ::tcl::tm::path list. Это называется Путь к модулям. Переменные auto_path и tcl_pkgPath не используются. Все каталоги в пути к модулям должны соответствовать одному ограничению:

Для любых двух каталогов ни один из них не является предком другого.

Это необходимо для избежания неоднозначности в именах пакетов. Например, если в пути находятся два каталога “foo/” и “foo/cool”, пакет с именем cool::ice можно найти как cool::ice или ice, что может затем замаскировать пакет с именем ice, без квалификатора.

Перед началом поиска имя запрашиваемого пакета преобразуется в частичный путь с помощью следующего алгоритма:

Все вхождения “::” в имени пакета заменяются соответствующим символом разделителя каталогов для текущей платформы. Например, в Unix это “/”.

Пример:

Запрашиваемый пакет — encoding::base64. Полученный частичный путь — “encoding/base64”.

После этого преобразования пакет ищется во всех путях к модулям, последовательно объединяя их с частичным путем для создания полного шаблона поиска. Обратите внимание, что алгоритм поиска отклоняет все файлы, где имя файла не соответствует регулярному выражению, указанному в разделе ОПРЕДЕЛЕНИЕ МОДУЛЯ. Для оставшихся файлов генерируются и добавляются в базу данных пакета скрипты предоставления, если необходимо.

Алгоритм возвращается к обработчику неизвестных случаев, когда ни один из найденных файлов модулей не удовлетворяет запросу. Если запрос был удовлетворён, откат игнорируется.

Обратите внимание, что пакеты в форме модулей не имеют контроля над индексным и скриптом предоставления, введёнными в базу данных пакета для них. Для файла модуля MF индексный скрипт всегда:

package ifneeded PNAME PVERSION [list source MF]

а скрипт предоставления, встроенный в вышеприведенное, равен:

source MF

Имя пакета PNAME и версия пакета PVERSION извлекаются из имени файла MF в соответствии с определением ниже:

MF = /module_path/PNAME′-PVERSION.tm

Где PNAME′ — частичный путь модуля, как определено в разделе ПОИСК МОДУЛЕЙ, и преобразованный в PNAME путём изменения всех разделителей каталогов на “::”, а module_path — путь (из списка путей для поиска), в котором был найден файл модуля.

Также обратите внимание, что мы здесь создаём связь между именами пакетов и путями. Tcl различает регистры при сравнении имён пакетов, но существуют файловые системы, которые этого не делают, например, NTFS. К счастью, эти файловые системы сохраняют регистр имени, несмотря на то, что не используют эту информацию при сравнении.

Учитывая вышесказанное, мы допускаем использование смешанного регистра в именах пакетов в модулях Tcl, но также требуем, чтобы не было коллизий при сравнении имён без учёта регистра. Другими словами, если пакет Foo развернут в виде модуля Tcl, пакеты foo, fOo и т. д. больше не допускаются.

Пути по умолчанию

Список путей по умолчанию в пути к модулям вычисляется интерпретатором tclsh следующим образом, где X — главная версия интерпретатора Tcl, а y — второстепенная версия, меньше или равная второстепенной версии интерпретатора Tcl.

Все пути по умолчанию добавляются в путь к модулям, даже те, которых не существует. Несуществующие пути отфильтровываются во время фактического поиска. Это позволяет пользователю создавать один из искомых путей по мере необходимости, и все запущенные приложения автоматически подберут любые модули, размещённые в них.

Пути добавляются в порядке, в котором они указаны ниже, а для списков путей, определённых переменной среды, — в порядке их обнаружения в переменной.

Пути, специфичные для системы

file normalize [info library]/../tclX/X.y
Другими словами, интерпретатор будет искать каталог, указанный по его основной версии, и чьи второстепенные версии меньше или равны второстепенной версии интерпретатора.

Например, для Tcl 8.4 ищутся следующие пути:

[info library]/../tcl8/8.4
[info library]/../tcl8/8.3
[info library]/../tcl8/8.2
[info library]/../tcl8/8.1
[info library]/../tcl8/8.0

Это определение предполагает, что пакет, определённый для Tcl X.y, также может быть использован всеми интерпретаторами, у которых основное число X одинаково и второстепенное число больше y.

file normalize EXEC/tclX/X.y
Где EXEC — file normalize [info nameofexecutable]/../lib или file normalize [::tcl::pkgconfig get libdir,runtime]

Этот набор путей обрабатывается аналогично предыдущему, за исключением того, что он привязан к EXEC_PREFIX. При сборке с PREFIX = EXEC_PREFIX оба набора одинаковы.

Пути, специфичные для сайта

file normalize [info library]/../tclX/site-tcl
Обратите внимание, что это всегда один элемент, так как X всегда имеет определённое значение (текущая основная версия Tcl).

Пути, специфичные для пользователя

$::env(TCLX_y_TM_PATH)
Список путей, разделенных либо : (Unix), либо ; (Windows). Данная переменная окружения зависит от пользователя и сайта, поскольку может быть установлена не только в профиле пользователя, но и скриптами конфигурации системы.
$::env(TCLX.y_TM_PATH)
Имеет то же значение и содержимое, что и предыдущая переменная. Однако использование точки '.' для разделения номера основной и дополнительной версии делает это имя менее переносимым, и его использование не рекомендуется. Поддержка этой переменной сохранена только для обратной совместимости со спецификацией оригинала, т. е. TIP 189.

Эти пути видны и, следовательно, общие для всех оболочек Tcl в $::env(PATH) пользователя.

Обратите внимание, что X и y следуют общим правилам, изложенным выше. Другими словами, Tcl 8.4, например, будет рассматривать эти 10 переменных окружения:

$::env(TCL8.4_TM_PATH)  $::env(TCL8_4_TM_PATH)
$::env(TCL8.3_TM_PATH)  $::env(TCL8_3_TM_PATH)
$::env(TCL8.2_TM_PATH)  $::env(TCL8_2_TM_PATH)
$::env(TCL8.1_TM_PATH)  $::env(TCL8_1_TM_PATH)
$::env(TCL8.0_TM_PATH)  $::env(TCL8_0_TM_PATH)

См. также

пакет, Tcl Improvement Proposal #189 “Tcl Modules” (онлайн по адресу http://tip.tcl.tk/189.html), Tcl Improvement Proposal #190 “Implementation Choices for Tcl Modules” (онлайн по адресу http://tip.tcl.tk/190.html)

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/tm.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/tm.htm

Spec-Zone.ru

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