Tcl: Interpreter creates copy of traced object whet it goes changed在这个问题中,我问为什么解释器会在跟踪中创建一个对象副本?我知道使用句柄是正确的方法,但它需要大量的工作,因此我需要解决方法。
我需要跟踪代码的行为与在set命令之后写入的代码完全相同。 我需要更改跟踪中的对象,我希望解释器不要复制对象。如果以某种方式禁用跟踪功能中的复制功能,那将是很好的。
我看过这里http://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/TraceVar.3.html但没有找到它。
答案 0 :(得分:2)
当多个引用保持打开时(即,当Tcl_Obj
报告共享该值时)更改Tcl_IsShared
本身会导致各种语义问题(许多函数 - 例如{ {1}} - 如果你尝试的话,专门检查并中止流程,所以你需要特别小心。你正在超越Tcl的语义;这里有龙!
要直接修改Tcl_SetIntObj
,请查看结构的Tcl_Obj
字段(bytes
字段应保留为length
strlen
})。那是可写的;只需改变它,记住它总是被编码为伪UTF-8(对于bytes
以外的ASCII字符非常直接)。如果要更改分配的内容,则必须使用\u0000
分配字段。如果Tcl_Alloc
为bytes
,则没有字符串表示形式;看看意义的内部表征。
NULL
的内部表示由Tcl_Obj
联合和internalRep
字段决定。理解typePtr
的含义取决于理解internalRep
指向的内容;通常,如果你没有实现它,你根本不应该四处寻找。我们做有时会更改补丁版本中存在的内部表示。如果您将typePtr
定义为指向您拥有的结构,您将知道如何理解内部表示。当typePtr
字段为typePtr
时,没有内部表示。
有时您可能会遇到既没有内部也没有字符串表示的NULL
。如果找到,请不要更改。它保留给(非常高度共享的)空值。
虽然技术上可以通过在内部进行修改来改变共享对象,但其余的Tcl假设你不会这样做因此它可能会破坏它的随机性。你甚至可以逃脱它!但请注意,我们不会正式支持您;你是独自一人。