如何使用Tcl_ParseCommand或「http://tmml.sourceforge.net/doc/tcl/」下已有的Tcl C程序列表。我是否需要爲這些命令中的每一個編寫wrapper c過程和init過程?在tcl腳本中使用現有的tcl c程序
-Prasath
如何使用Tcl_ParseCommand或「http://tmml.sourceforge.net/doc/tcl/」下已有的Tcl C程序列表。我是否需要爲這些命令中的每一個編寫wrapper c過程和init過程?在tcl腳本中使用現有的tcl c程序
-Prasath
訪問解析器最簡單的方式命令Tcl_ParseCommand等可能是tclparser分機(例如,(孤立的)tclparser包Debian中/ Ubuntu或從源http://wiki.tcl.tk/1660建立自己)。
如果您還需要處理其他Tcl C庫命令,您應該看看如何編寫Tcl擴展。很多示例和建議可以在這裏找到:http://wiki.tcl.tk/1191
太好了。感謝您的建議。由於像Tcl_ParseCommand等Tcl c庫是內置的,我認爲必須有一個gereric方法可以在tcl腳本中工作,而不需要爲每個c api寫一個擴展。看來我必須擴展這些c庫,就好像我爲新c程序做的那樣。 (我對麼?)。 – Prasath 2011-04-28 09:14:08
大多數Tcl c api只是和簡單的Tcl命令一樣,所以可以直接訪問它們中的大多數,但是在腳本層中有一些c api的部分不太有用或不需要。例如,Tcl_Eval與eval或源或命名空間eval或插入或其他評估腳本的方法之一相同。實際上,在普通腳本中很少有功能不可用,主要是初始化,內存分配和其他實用程序,或深層內部事件,如向通知程序註冊新事件源。其餘的只是一個僞裝的Tcl命令。 – schlenk 2011-04-28 09:48:26
hmm。好。問題在於爲每個tcl編寫c擴展c庫對於我來說很麻煩,因爲我對c的知識很少。我也很難理解如何從包裝器中將必需的參數傳遞給tcl c api,然後將這些c api的返回值轉換回tcl腳本。 – Prasath 2011-04-28 14:47:57
是的,你確實需要編寫一個包裝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}]
有用的文檔on the Tcler's Wiki。
請注意,特別是對於Tcl_ParseCommand
,您最好使用schlenk提到的tclparser軟件包。這是因爲該函數的結果(作爲out參數)顯着不重要;它需要相當多的轉換才能轉變成一種Tcl值。
是的,這是一個Tcl腳本中的C代碼,它可以工作。 Critcl非常棒;希望我能寫出來。 – 2011-04-29 15:50:52
這給了一線希望。讓我嘗試安裝critcl並嘗試一些例子。非常感謝所有人。 – Prasath 2011-04-29 18:49:40
你的問題有點含糊。要使用Tcl C-API,您可以創建一個Tcl擴展包或將Tcl解釋器嵌入到您自己的C程序中(查看tclsh shell的源代碼)。 – schlenk 2011-04-27 21:41:11
我的目的是在我的tcl腳本中使用tcl c程序。你可以讓我知道如何爲Tcl庫中的這些現有c程序創建一個Tcl擴展包。我不想在c中創建自己的命令。 – Prasath 2011-04-28 03:17:09