Как мне найти, где функция объявлена ​​в Tcl? - PullRequest
0 голосов
/ 12 октября 2018

Я думаю, что это больше вопрос конфигурации Tcl, чем вопрос кодирования Tcl ...

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

Например, вместо того, чтобы использовать source, кто-то создает пользовательскую включаемую функцию, которую они назвали INCLUDE.Очевидно, что Tclsh не работает, когда я пытаюсь запустить его там, но с моим программным обеспечением для моделирования он работает нормально.

Я пробовал просмотреть все программное обеспечение для моделирования для INCLUDE, но мне не повезло.Есть ли другие очевидные места за пределами программного обеспечения для моделирования, где можно определить функцию Tcl?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Возможности:

  • В вашем программном обеспечении.(Вы проверили это).
  • В некоторых других пакетах, включенных в программное обеспечение.Проверьте и посмотрите, установлена ​​ли переменная окружения TCLLIBPATH.Также проверьте и убедитесь, что программное обеспечение для моделирования устанавливает TCLLIBPATH.Это будет список каталогов для поиска пакетов Tcl, и вам нужно будет искать пакеты, расположенные вне основного дерева исходных текстов.

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

  • В обработчике команд unknown .Это может быть в вашем программном обеспечении или в другом пакете.Вы должны быть в состоянии найти некоторый код, который обрабатывает оператор INCLUDE.
  • Внутри двоичного пакета.Это общие библиотеки, которые загружаются Tcl.Если это так, то для создания разделяемой библиотеки должен использоваться некоторый код на C, который можно искать.

Поскольку вы говорите, что существует множество экземпляров неизвестных функций, мое первое предположение состоит в том, что у вас естьне найдены все каталоги, из которых загружаются пакеты.Но возможен и «неизвестный» обработчик команд.

Редактировать:

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

0 голосов
/ 12 октября 2018

Это не лучший ответ для вас, но я подозреваю, что это лучшее, что вы получите ...

Процедура может быть определена во многих местах.Лучше всего найти его, используя инструмент типа findstr (в Windows) или grep -R (на платформах POSIX) для поиска по всем соответствующим исходным файлам.Но это все еще не может помочь!Это может быть не процедура, а общая команда, которая может быть реализована в C, а не как процедура, или ее можно определить в архиве упакованного приложения (которое обычно неудобно смотреть внутрь).Есть также другие типы команд, реализованных в скриптах, которые могут сделать вещи неловкими.Как правило, поиск и исследование - ваш лучший выбор, но он может не сработать.

Tcl не сильно различает команды разных типов, за исключением некоторых операций самоанализа.Если вам повезет, вы можете обнаружить, что info body говорит вам определение процедуры (а info args и info default говорит вам об аргументах), но это совсем не поможет с другими типами команд.Tcl 8.7 будет включать команду (info cmdtype), которая очень поможет сузить, что делать дальше, но сейчас это бесполезно и определенно не существует в более старых версиях.

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