#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 и попробовать несколько примеров. большое спасибо всем.