Printing 如何教Tcl使用我提供的proc自动打印我的对象?

Printing 如何教Tcl使用我提供的proc自动打印我的对象?,printing,tcl,decorator,Printing,Tcl,Decorator,我有一个Tcl在控制台中显示为其对象id的对象。我如何扩展Tcl,以便在打印我类型的对象时,自动调用我提供的一个特殊过程来打印其内容,而不仅仅是提供对象id 更多细节:我正在模拟Tcl中的lisp列表,它由cons单元组成,每个单元都有一个car和一个cdr。1“两个”3的列表将创建为: (cons 1 (cons "two" (cons 3 nil))) 这将创建3个cons单元格。车内有1的顶部cons单元格有一个指针,指向车内有“2”的第二个cons单元格,以此类推 基于此陈述,我希望上

我有一个Tcl在控制台中显示为其对象id的对象。我如何扩展Tcl,以便在打印我类型的对象时,自动调用我提供的一个特殊过程来打印其内容,而不仅仅是提供对象id

更多细节:我正在模拟Tcl中的lisp列表,它由cons单元组成,每个单元都有一个car和一个cdr。1“两个”3的列表将创建为:

(cons 1 (cons "two" (cons 3 nil)))
这将创建3个cons单元格。车内有1的顶部cons单元格有一个指针,指向车内有“2”的第二个cons单元格,以此类推

基于此陈述,我希望上述样本列表打印为:

(1 "two" 3)

我想你是在C级工作。基本上,您可以在
updateStringProc
字段中的
Tcl\u ObjType
结构中注册一个函数来执行此操作。您的函数需要生成整体值的字符串呈现(存储在
Tcl_Obj
bytes
字段中的
ckalloc
ed字符串中);如何做到这一点取决于您。

是什么产生了这些对象ID?对象是否能够完全由其字符串表示形式来描述?@Donal Fellows我已经扩展了这个问题以提供更多细节。C++对象有一个对象ID。一个CONS单元可以用一个字符串来描述,它将指针值保存到内存中的对象位置。这会改变Tcl对象的字符串表示形式吗?如果是这样的话,如果所计算的字符串表示不能让您再次返回同一个对象,这会导致麻烦吗?@WilliamKF:是的,但是“同一个对象”对您意味着什么?在标准的Tcl解释中,如果两个对象看起来相同,则它们是相同的(因此有“一切都是字符串”的说法;事实并非如此,但它是真实语义的方便代理)。如果您希望除了表示之外还有标识(例如,您可以指定给对象的特定部分),那么您必须使用handle方法并使用显式命令来获取表示。Tcl的值系统与许多其他语言的值系统有很大的不同,它既有优点也有缺点。最大的优点是,Tcl比其他语言更倾向于共享文本和值,而简单的引用计数系统通常适合于“GC”。最大的缺点是,由于完全不同的身份模型,很难与其他(脚本)语言共享值;正因为如此,Tcl无法与许多字节码引擎融为一体。