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

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

-Прасат


person Prasath    schedule 27.04.2011    source источник
comment
Ваш вопрос немного расплывчатый. Чтобы использовать Tcl C-API, вы либо создаете пакет расширения Tcl, либо встраиваете интерпретатор Tcl в свою собственную программу на C (посмотрите на исходники оболочки tclsh).   -  person schlenk    schedule 28.04.2011
comment
Моя цель — использовать процедуры tcl c в моем сценарии tcl. Не могли бы вы сообщить мне, как создать пакет расширения Tcl для этих существующих процедур c, доступных в библиотеке Tcl. я не собираюсь создавать свою собственную команду в c.   -  person Prasath    schedule 28.04.2011


Ответы (2)


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

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

person schlenk    schedule 28.04.2011
comment
Замечательно. Спасибо за предложение. Поскольку библиотеки Tcl c, такие как Tcl_ParseCommand и т. д., встроены, я подумал, что должен быть уже доступный общий способ, чтобы заставить это работать в сценариях tcl без необходимости писать расширение для каждого c api. Кажется, мне нужно расширить эти библиотеки C, как если бы я делал это для новых процедур C. (я прав?). - person Prasath; 28.04.2011
comment
Большинство API-интерфейсов Tcl делают то же самое, что и простые команды Tcl, поэтому у вас есть прямой доступ к большинству из них, но есть некоторые части API-интерфейсов, которые менее полезны или необходимы на уровне сценариев. Например, Tcl_Eval — это то же самое, что и eval, или source, или namespace eval, или interp eval, или один из других способов оценки скрипта. На самом деле очень мало функций, недоступных в обычном сценарии, в основном это инициализация, выделение памяти и другие утилиты или глубокие внутренние функции, такие как регистрация новых источников событий в уведомлении. Все остальное — просто замаскированная команда Tcl. - person schlenk; 28.04.2011
comment
Хм. Ok. проблема в том, что написание расширения c для каждой библиотеки tcl c для меня обременительно, так как у меня мало знаний в c. Также мне трудно понять, как передать требуемые аргументы в tcl c api из оболочек, а затем преобразовать возвращаемые значения этих c api обратно в сценарий tcl. - person Prasath; 28.04.2011

Да, вам нужно написать команду-оболочку, реализованную на 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, &nObjs, &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}]

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

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

person Donal Fellows    schedule 29.04.2011
comment
И да, это C-код внутри Tcl-скрипта, и он работает. Critcl довольно крут; жаль, что я не написал это. - person Donal Fellows; 29.04.2011
comment
Это дает луч надежды. позвольте мне попробовать установить critcl и попробовать несколько примеров. большое спасибо всем. - person Prasath; 29.04.2011