2011-04-27 139 views
0

如何使用Tcl_ParseCommand或「http://tmml.sourceforge.net/doc/tcl/」下已有的Tcl C程序列表。我是否需要爲這些命令中的每一個編寫wrapper c過程和init過程?在tcl腳本中使用現有的tcl c程序

-Prasath

+0

你的問題有點含糊。要使用Tcl C-API,您可以創建一個Tcl擴展包或將Tcl解釋器嵌入到您自己的C程序中(查看tclsh shell的源代碼)。 – schlenk 2011-04-27 21:41:11

+0

我的目的是在我的tcl腳本中使用tcl c程序。你可以讓我知道如何爲Tcl庫中的這些現有c程序創建一個Tcl擴展包。我不想在c中創建自己的命令。 – Prasath 2011-04-28 03:17:09

回答

0

訪問解析器最簡單的方式命令Tcl_ParseCommand等可能是tclparser分機(例如,(孤立的)tclparser包Debian中/ Ubuntu或從源http://wiki.tcl.tk/1660建立自己)。

如果您還需要處理其他Tcl C庫命令,您應該看看如何編寫Tcl擴展。很多示例和建議可以在這裏找到:http://wiki.tcl.tk/1191

+0

太好了。感謝您的建議。由於像Tcl_ParseCommand等Tcl c庫是內置的,我認爲必須有一個gereric方法可以在tcl腳本中工作,而不需要爲每個c api寫一個擴展。看來我必須擴展這些c庫,就好像我爲新c程序做的那樣。 (我對麼?)。 – Prasath 2011-04-28 09:14:08

+1

大多數Tcl c api只是和簡單的Tcl命令一樣,所以可以直接訪問它們中的大多數,但是在腳本層中有一些c api的部分不太有用或不需要。例如,Tcl_Eval與eval或源或命名空間eval或插入或其他評估腳本的方法之一相同。實際上,在普通腳本中很少有功能不可用,主要是初始化,內存分配和其他實用程序,或深層內部事件,如向通知程序註冊新事件源。其餘的只是一個僞裝的Tcl命令。 – schlenk 2011-04-28 09:48:26

+0

hmm。好。問題在於爲每個tcl編寫c擴展c庫對於我來說很麻煩,因爲我對c的知識很少。我也很難理解如何從包裝器中將必需的參數傳遞給tcl c api,然後將這些c api的返回值轉換回tcl腳本。 – Prasath 2011-04-28 14:47:57

0

是的,你確實需要編寫一個包裝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值。

+0

是的,這是一個Tcl腳本中的C代碼,它可以工作。 Critcl非常棒;希望我能寫出來。 – 2011-04-29 15:50:52

+0

這給了一線希望。讓我嘗試安裝critcl並嘗試一些例子。非常感謝所有人。 – Prasath 2011-04-29 18:49:40