Вызов процедуры из другого сценария без использования источника Tcl - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть некоторые сомнения относительно сценариев Tcl.Можно ли вызвать процедуру из одного файла в другой без поиска файла, содержащего процедуру?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать функцию автозагрузки Tcl.Стандартный способ - поместить файл (ы) с вашими процедурами в один из каталогов, перечисленных в переменной auto_path.Затем выполните команду auto_mkindex для этого каталога и файлов.Это создаст файл с именем tclIndex в каталоге.

Затем вы можете просто использовать процедуры в ваших скриптах, и они будут автоматически загружаться при использовании.

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

Пример: предположим, что / usr / share / tcl находится в вашем auto_path (вы также можете использовать каталог, который не находится в auto_path по умолчанию, но затем вы должны добавить его в начале каждого скрипта).Вы создаете каталог в / usr / share / tcl с именем helpers.В этом каталоге вы создаете файлы с некоторыми командами, которые вам нравятся, чтобы быть доступными для всех ваших скриптов.Как файл с именем cat.tcl:

proc cat {filename} {
    if {[catch {open $filename} fd opts]} {
        return -options [dict incr opts -level] -errorinfo "" $fd
    }
    try {
        return [read -nonewline $fd]
    } finally {
        close $fd
    }
}

Затем вы запускаете tclsh (для указанного каталога вам, вероятно, нужно сделать это как root) и запускаете следующую команду:

auto_mkindex /usr/share/tcl helpers/*.tcl

Это создает файл с именем tclIndex в / usr / share / tcl.С этого момента вы можете просто использовать команду cat в любом сеансе или скрипте Tcl:

cat /etc/motd
0 голосов
/ 22 ноября 2018

Что-то должен source код, чтобы сделать его исполняемым, но это не всегда должно быть вашим текущим процессом.Вы можете легко написать отдельный скрипт для исходного кода, запустить эту процедуру и вызвать ее с помощью exec.


Пример:

Скрипт запуска, runner.tcl:

set arguments [lassign $argv packageInfo commandName]
package require {*}$packageInfo
puts [$commandName {*}$arguments]
exit

Используйте сценарий:

# This just makes using the subprocess a little neater
proc runInPackage {packageInfo args} {
    return [exec [info nameofexecutable] runner.tcl $packageInfo {*}$args]
}

# This will call FooBarProc from version 1.2 of the FooBarPackage
set result [runInPackage {FooBarPackage 1.2} FooBarProc 1 2 3 4 5]

Существуют способы сделать более сложные вещи с помощью подходящих уловок… но этого достаточно, чтобы проделать долгий путь!Если ваши аргументы не слишком велики.

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