2016-02-12 71 views
1

我構建了一個使用Tcl作爲其命令接口的程序。作爲集成的一部分,我定義了一些自定義的Tcl_ObjType和一些在C/C++中用Tcl_CreateObjCommand實現的命令。內置Tcl類型內部表示

當解析命令行參數,我不知道如果我的內建類型的操作就完成了。

是否有任何6(?)內建類型的對象(Tcl_Obj)的字段看起來像什麼地方的描述?像這樣的表,顯示了Tcl_Obj字段值

思考:

Human  |  |   | 
type name | bytes | type  | internalRep 
---------------------------------------------------------------- 
scalar | value | NULL  | all NULL 
list  | NULL | "list" | otherValuePtr has the value 
array  | NULL | "dict" | ??? 
file  | ??? | "channel" | ??? 
?????  | ??? | ?????  | ??? 
?????  | ??? | ?????  | ??? 

回答

0

有恰恰沒有確切的文件,因爲它是一個用戶可擴展類型。但是,我可以指出一些事情。

所有值都具有非NULL bytes字段或非NULL typePtr字段或兩者都有。對於一個小的整數,則typePtr(這是一種虛函數表的,如果你知道C++)將表明它是一個int,而internalReplongValue成員持有的價值是什麼。當小整數作爲一個字符串,其byteslength領域得到填充(通過調用typePtrupdateStringProc)。對於大整數,該值存儲爲指向mp_int(在otherValuePtr中)的指針。對於浮點值,它是doubleValue字段。

列表和類型的字典實際上都使用twoPtrValue;在更新期間使值的樹無效時使用輔助指針(否則爲NULL)。主指針後面分別是指向ListDict結構的指針,並且這些指針在內部被重新計數和管理。

然而,字段的確切含義依賴於typePtr,並且僅由通常知道如何談論他們,以及其他一切包括內部的Tcl本身不幕後偷看一個很小的API聞名。思考如何在概念上給你的函數一個更緊湊的類型簽名,然後使用Tcl_GetIntFromObjTcl_ListObjGetElements之類來強制簽名是一種很好的風格;該功能強制執行並緩存類型。如果你讓你自己的,到目前爲止最簡單的方法是從字符串形式(您可以隨時Tcl_GetStringFromObj獲得,從未出錯),然後從那裏工作開始。最常見的第三方類型是允許通過散列表或其他映射跳過查找的所有緩存。其他可能性當然存在。


我們沒有內部類型的完整列表。最簡單的事情可能是在Tcl 8.6中試用tcl::unsupported::representation,因爲這樣可以讓您以有限的方式瞭解正在發生的事情,而無需訴諸編寫C代碼。只要記住,偷看這種類型是非常糟糕的風格;它僅用作調試工具。

+0

我們可以看一下具體的類型,但是這真的只是「閱讀源代碼」。 Tcl的語言級別類型被認爲是實現細節,而不是API的一部分。 –