Как использовать Tcl_ParseCommand или список процедур Tcl C, уже доступных на "http://tmml.sourceforge.net/doc/tcl/". Нужно ли мне писать процедуру оболочки c и процедуру инициализации для каждой из этих команд?
-Прасат
Как использовать Tcl_ParseCommand или список процедур Tcl C, уже доступных на "http://tmml.sourceforge.net/doc/tcl/". Нужно ли мне писать процедуру оболочки c и процедуру инициализации для каждой из этих команд?
-Прасат
Самый простой способ получить доступ к командам синтаксического анализатора Tcl_ParseCommand и т. д. может быть расширением tclparser (например, (бесхозный) пакет tclparser в Debian/Ubuntu или сборка самостоятельно из исходников http://wiki.tcl.tk/1660).).
Если вам нужно обрабатывать и другие команды Tcl C-библиотеки, вам следует взглянуть на то, как написать расширение Tcl в целом. Множество примеров и советов по этому поводу можно найти по адресу: http://wiki.tcl.tk/1191
Да, вам нужно написать команду-оболочку, реализованную на 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.