Да, вам нужно написать команду, реализованную на языке 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 .
Обратите внимание, что для Tcl_ParseCommand
, в частности, лучше использовать пакет tclparser, как упоминает schlenk. Это потому, что результат этой функции (как выходной параметр) существенно нетривиален; для превращения в нечто вроде значения Tcl требуется немало преобразований.