использование существующих процедур tcl c в скрипте tcl

#command #tcl #procedures

#команда #tcl #процедуры

Вопрос:

Как использовать Tcl_ParseCommand или список процедур Tcl C, уже доступных в разделе «http://tmml.sourceforge.net/doc/tcl /». Нужно ли мне писать процедуру-оболочку c и процедуру инициализации для каждой из этих команд?

-Прасат

Комментарии:

1. Ваш вопрос немного расплывчатый. Чтобы использовать Tcl C-API, вы либо создаете пакет расширения Tcl, либо встраиваете интерпретатор Tcl в свою собственную программу на C (взгляните на исходные тексты для оболочки tclsh).

2. Моя цель — использовать процедуры tcl c в моем скрипте tcl. не могли бы вы сообщить мне, как создать пакет расширения Tcl для этих существующих процедур c, доступных в библиотеке Tcl. я не собираюсь создавать свою собственную команду на c.

Ответ №1:

Самым простым способом получить доступ к командам синтаксического анализа Tcl_ParseCommand и т.д. Может быть расширение tclparser (например, (потерянный) пакет tclparser в Debian / Ubuntu или создать самостоятельно из исходных текстовhttp://wiki.tcl.tk/1660 ).

Если вам также необходимо обрабатывать другие команды Tcl C-library, вам следует взглянуть на то, как написать расширение Tcl в целом. Множество примеров и советов для этого можно найти по адресу: http://wiki.tcl.tk/1191

Комментарии:

1. Это здорово. Спасибо за предложение. Поскольку библиотеки Tcl c, такие как Tcl_ParseCommand и т.д., встроены, я подумал, что должен быть уже доступный общий способ заставить это работать в скриптах tcl без необходимости писать расширение для каждого c api. Кажется, я должен расширить эти библиотеки c, как если бы я делал для новых процедур c. (я прав?).

2. Большинство Tcl c api выполняет то же самое, что и простые команды Tcl, так что в некотором смысле у вас есть прямой доступ к большинству из них, но есть некоторые части c api, которые менее полезны или необходимы на уровне сценариев. Например, Tcl_Eval точно такой же, как eval, или source, или namespace eval, или interp eval, или один из других способов оценки скрипта. На самом деле существует очень мало функций, недоступных в обычном скрипте, в основном инициализация, выделение памяти и другие утилиты, или глубокие внутренние компоненты, такие как регистрация новых источников событий в уведомителе. Все остальное — это просто замаскированная команда Tcl.

3. хм. ок. проблема в том, что написание расширения c для каждой библиотеки tcl c для меня громоздко, поскольку у меня мало знаний в c. Также мне сложно понять, как передавать требуемые аргументы в tcl c api из оболочек, а затем преобразовывать возвращаемые значения этих c api обратно в tcl script.

Ответ №2:

Да, вам действительно нужно написать команду-оболочку, реализованную на C, чтобы использовать их. Однако существует ряд удобных инструментов, которые упрощают это. В частности, интересным выбором является critcl, который вы могли бы использовать вот так (очень узкий пример):

 package require critcl
critcl::cproc foo {Tcl_Interp* interp Tcl_Obj* argObj} ok {
    int nObjs;
    Tcl_Obj **objs;

    if (Tcl_ListObjGetElements(interp, argObj, amp;nObjs, amp;objs) != TCL_OK)
        return TCL_ERROR;
    if (nObjs != 2) {
        Tcl_AppendResult(interp, "need list of length 2", NULL);
        return TCL_ERROR;
    }
    Tcl_SetObjResult(interp, Tcl_NewBooleanObj(
            !strcmp(Tcl_GetString(objs[0]), Tcl_GetString(objs[1]))));
    return TCL_OK;
}
puts [foo {a a}]
  

Полезная документация находится в Wiki Tcler.

Обратите внимание, что для Tcl_ParseCommand в частности, вам лучше использовать пакет tclparser, о котором упоминает шленк. Это потому, что результат этой функции (в качестве параметра out) значительно нетривиален; требуется довольно много преобразований, чтобы превратиться в нечто, работающее как значение Tcl.

Комментарии:

1. И да, это C-код внутри скрипта Tcl, и он работает. Critcl довольно потрясающий; жаль, что я его не написал.

2. Это дает луч надежды. позвольте мне попробовать установить critcl и попробовать несколько примеров. большое спасибо всем.