如何使用 Tcl_ParseCommand 或“http://tmml.sourceforge.net/doc/tcl/”下已有的 Tcl C 程序列表。我是否需要为每个命令编写包装器 c 过程和初始化过程?
-普拉萨特
如何使用 Tcl_ParseCommand 或“http://tmml.sourceforge.net/doc/tcl/”下已有的 Tcl C 程序列表。我是否需要为每个命令编写包装器 c 过程和初始化过程?
-普拉萨特
访问解析器命令 Tcl_ParseCommand 等的最简单方法可能是 tclparser 扩展(例如 Debian/Ubuntu 中的(孤立的)tclparser 包或从源代码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 值一样工作的东西。