gpt4 book ai didi

c - 内置 Tcl 类型内部表示

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:49 29 4
gpt4 key购买 nike

我正在构建一个使用 Tcl 作为其命令接口(interface)的程序。作为集成的一部分,我已经定义了一些自定义 Tcl_ObjType 和一些使用 C/C++ 实现的命令 Tcl_CreateObjCommand

在解析命令参数时,我不确定我对内置类型的处理是否完整。

是否有任何 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" | ???
????? | ??? | ????? | ???
????? | ??? | ????? | ???

最佳答案

没有准确的文档,因为它是用户可扩展的类型。不过,我可以指出几点。

所有值都具有非 NULL bytes字段或非 NULL typePtr领域,或两者兼而有之。对于小整数,typePtr (这是一种 vtable,如果你了解 C++)将表明它是一个 int , 和 longValue internalRep的成员持有值(value)是什么。当那个小整数用作字符串时,它的 byteslength填充字段(通过调用 updateStringProctypePtr)。对于大整数,该值存储为指向 mp_int 的指针。 (在 otherValuePtr 中)。对于浮点值,它是 doubleValue字段。

列表和字典实际上都使用 twoPtrValue ;在更新期间使值树无效时使用辅助指针(否则为 NULL)。主指针后面是指向 List 的指针或 Dict struct,并且那些在内部引用计数和管理。

但是,字段的确切含义取决于 typePtr并且通常只有知道如何谈论它们的小型 API 才知道,而其他所有内容包括 Tcl 本身都不会在幕后窥视。从概念上考虑为您的函数提供更严格的类型签名,然后使用 Tcl_GetIntFromObj 之类的东西是一种很好的风格。或 Tcl_ListObjGetElements强制执行签名;这些函数强制执行并缓存类型。如果您要自己制作,到目前为止 最简单的方法是从字符串形式开始(您始终可以使用 Tcl_GetStringFromObj 获得它,它永远不会出错)然后从那里开始工作。最常见的第三方类型都是允许通过哈希表或其他映射跳过查找的缓存。当然还有其他可能性。


我们没有完整的内部类型列表。最简单的方法可能是用 tcl::unsupported::representation 进行试验在 Tcl 8.6 中,因为这允许您以有限的方式窥视正在发生的事情,而无需诉诸编写 C 代码。请记住,偷看类型是非常糟糕的风格;它仅用作调试工具。

关于c - 内置 Tcl 类型内部表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372893/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com