为什么Tcl 9没有把“int”注册为“tclobj”类型?

我注意到在Tcl9中有三种 tclobj 类型已经被取消注册。由于我在代码中经常使用 intobj 作为数据类型,我应该如何处理以实现向后兼容?
if (tclObj->typePtr == Tcl_GetObjType("int")) {
...
Tcl_GetIntFromObj(interp, tclObj, xx);
...
}
解决方案
在8.* 的生命周期中,我们多次改变Tcl中整数的表示方式。具体来说,曾经有一个阶段,整数的内部表示是纯粹的32位带符号整数,然后是该表示或64位带符号整数,随后又可选地作为bignum(即任意长度整数,伴随相当大的内存分配开销)。
关于何时使用哪种表示的具体细节一直都是实现细节;作为语言的使用者,甚至是对外暴露的C API的使用者,你不应该在意。 一个值只要能被当作整数使用,就是一个整数;表示方式不过是缓存中的一个不重要的内部细节。
之所以不注册 int 类型描述符,是因为回头看我们认为整个注册机制是个坏主意。类型探针(尤其是那些你未声明的类型)极其脆弱;它们取决于你无法控制的代码如何管理其内部状态。
相反,你可以使用 Tcl_GetNumberFromObj 并查看类型代码报告的结果(通过 typePtr 的OUT参数)是什么。具体来说,如果你得到 TCL_NUMBER_INT,那么它就是一个64位带符号整数。不过如果不是,它会把值转换为数值类型族中的其它成员。
有些语言根据传入的类型让行为不同,这种做法是非常非Tcl的 API风格。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。