I building a program that uses Tcl as its command interface. As part of the integration I have defined a few custom university_id
's and a few commands implemented in C/C++ with Tcl_ObjType
.
When parsing the command arguments I am not sure if my handling of the built in types is complete.
Is there a description somewhere of what the fields of an object(Tcl_CreateObjCommand
) of any of the 6(?) built-in types looks like?
Thinking of a table like this, showing the Tcl_Obj field values:
Tcl_Obj
答案 0 :(得分:0)
没有准确的文档,因为它是用户可扩展的类型。但是,我可以指出一些事情。
所有值都有非NULL bytes
字段或非NULL typePtr
字段,或两者都有。对于一个小整数,typePtr
(如果您了解C ++,这是一种vtable)将表明它是int
,longValue
成员internalRep
保持价值。当该小整数用作字符串时,其bytes
和length
字段将被填充(通过调用updateStringProc
的{{1}}。对于大整数,该值存储为指向typePtr
的指针(在mp_int
中)。对于浮点值,它是otherValuePtr
字段。
列表和词典实际上都使用doubleValue
;在更新期间使值树无效时使用辅助指针(否则为NULL)。主指针后面分别是指向twoPtrValue
或List
结构的指针,这些结构在内部被重新计数和管理。
但是,字段的确切含义取决于Dict
,并且通常只有知道如何讨论它们的小API以及其他所有(包括Tcl内部)才知道不要躲在窗帘后面。考虑在概念上为您的函数提供更严格的类型签名,然后使用typePtr
或Tcl_GetIntFromObj
等强制执行签名,这是一种很好的风格;这些函数强制执行并缓存类型。如果您自己创建自己,最简单的方法到目前为止是从字符串形式开始的(您始终可以使用Tcl_ListObjGetElements
获取,这绝不会出错)然后从那里。最常见的第三方类型是允许通过哈希表或其他映射跳过查找的所有缓存。当然还有其他可能性。
我们没有完整的内部类型列表。最简单的事情可能是在Tcl 8.6中试验Tcl_GetStringFromObj
,因为这样可以在不诉诸编写C代码的情况下以有限的方式查看正在发生的事情。请记住,偷看这种类型是非常糟糕的风格;它仅用作调试工具。