Как мы узнаем, какие пакеты существуют в нашей среде tcl и где они хранятся, и как включать новые пакеты? - PullRequest
1 голос
/ 05 августа 2020

Моей целью было выполнить лог-базу 2 в моем tcl-скрипте, но это вызвало некоторые вопросы о том, как работает tcl. Мне нужно сделать следующее:

  1. Найти список доступных пакетов в моей среде tcl
  2. Найти список процедур, доступных в пакете
  3. Найти "информацию" или " описание »процедуры, как при использовании переключателя -h или --help в оболочке
  4. Как добавить новый пакет в нашу среду tcl? Есть ли пакеты для загрузки для tcl, как для Python (где мы используем pip)?

Теперь я попытался выполнить некоторые команды самостоятельно, и трассировка приведена ниже:

% info log
error: unknown or ambiguous subcommand "log": must be args, body, class, cmdcount, commands, complete, coroutine, default, errorstack, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, object, patchlevel, procs, script, sharedlibextension, tclversion, or vars
    while executing
"info log"
% log(2.71)
error: invalid command name "log(2.71)"
    while executing
"log(2.71)"
% expr log(2.71)
0.9969486348916096
% info ::tcl::mathfunc
error: unknown or ambiguous subcommand "::tcl::mathfunc": must be args, body, class, cmdcount, commands, complete, coroutine, default, errorstack, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, object, patchlevel, procs, script, sharedlibextension, tclversion, or vars
    while executing
"info ::tcl::mathfunc"
% info ::tcl::mathfunc::log
error: unknown or ambiguous subcommand "::tcl::mathfunc::log": must be args, body, class, cmdcount, commands, complete, coroutine, default, errorstack, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, object, patchlevel, procs, script, sharedlibextension, tclversion, or vars
    while executing
"info ::tcl::mathfunc::log"
% expr ::tcl::mathfunc::log(2.71)
error: missing operand at _@_
in expression "_@_::tcl::mathfunc::log(2..."
    (parsing expression "::tcl::mathfunc::log(2...")
    invoked from within
"expr ::tcl::mathfunc::log(2.71)"
% info 
error: wrong # args: should be "info subcommand ?arg ...?"
    while executing
"info "
% info library
C:/intelFPGA/18.1/quartus/bin64/tcl8.6
% package names
systemconsole zlib TclOO tcl::tommath Tcl
% ::tcl::mathfunc::rand
0.6648586465347831
% info ::tcl::mathfunc::rand
error: unknown or ambiguous subcommand "::tcl::mathfunc::rand": must be args, body, class, cmdcount, commands, complete, coroutine, default, errorstack, exists, frame, functions, globals, hostname, level, library, loaded, locals, nameofexecutable, object, patchlevel, procs, script, sharedlibextension, tclversion, or vars
    while executing
"info ::tcl::mathfunc::rand"

В этой трассировке меня сбивают с толку:

  1. Выполнение "имен пакетов" возвращает "systemconsole zlib TclOO tcl :: tommath Tcl", и это не включает :: tcl :: mathfun c. Это почему? Этот список слишком мал!
  2. Почему log (2.71) возвращает ошибку «неверное имя команды», но expr log (2.71) работает?
  3. Почему expr :: tcl :: mathfun c :: log (2.71) не работает, но :: tcl :: mathfun c :: rand работает? Разве оба не входят в пакет mathfun c?

1 Ответ

1 голос
/ 05 августа 2020

Поиск пакетов

  1. Tcl ожидает построения списка пакетов, пока вы не запросите пакет, имя которого он в настоящее время не знает. catch {package require thereisnosuchpackage} должен в основном заполнять список.

    Однако есть некоторые пакеты, которые хранятся как модули Tcl и никогда не попадают в список. Они используют более эффективный механизм загрузки, но имеют несколько ограниченный формат. tcl::tm::path list предоставит список каталогов, в которых они могут быть найдены, и имя пакета и версия будут построены на его основе в файл.

    Мне не нравится, что нет способа получить список этих модулей аккуратно, даже если только для обслуживания и обнаружения.

Функции в выражениях

Команда expr перезаписывает вызов функции log(1.23) из:

expr { log(1.23) }

в вызов:

expr { [tcl::mathfunc::log [expr { 1.23 }]] }

что в конечном итоге эквивалентно:

expr { [tcl::mathfunc::log 1.23] }

, что, в свою очередь, фактически эквивалентно:

tcl::mathfunc::log 1.23

(«виртуально» здесь на самом деле , потому что функция журнала возвращает число с плавающей запятой. Есть некоторые незначительные технические различия с пользовательскими функциями.)

Обратите внимание, что скобки в приведенном выше вызове удалены; это просто синтаксис выражений. Технически, выражения - это их собственный маленький язык, встроенный в Tcl (который, в свою очередь, включает Tcl).

Перезапись для rand просто заканчивается удалением скобок, поскольку не требует аргументов.

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