使用" trace添加变量read"在tcl

时间:2017-10-13 21:13:11

标签: tcl

tcl的新手并尝试理解"跟踪添加变量"命令。

我理解当变量被写入"时需要调用回调函数。到。

但"读&#34>的用途是什么?选项?用于调试?

2 个答案:

答案 0 :(得分:1)

一个示例用途可能是全局计数器:

proc init { } {
  set ::globalcounter 0
  trace add variable ::globalcounter read ::gcountUpdate
}

proc gcountUpdate { } {
  incr ::globalcounter
}

proc main { } {
  init
  puts $::globalcounter
  puts $::globalcounter
}
main

我确信还有其他用途。正如你所指出的,调试。
它可以用于通过特定程序强制执行变量访问。

答案 1 :(得分:0)

读取回调的一个用途(确实比写回调更常见)是将Tcl变量链接到C变量; read回调用于强制读取C变量并将Tcl变量同步到它。 (写回调将确保Tcl变量的更新反映到C变量。)Tcl得到a built-in C API使用这种机制,虽然它使用底层C API进行变量跟踪,而不是使用Tcl API建立在它之上。

您还可以使用读回调来制作一个看似只读的变量:

trace add variable foo read {apply {args {
    upvar "#0" foo v
    set v "definitely this"
}}}

puts $foo
set foo "that"
puts $foo

我不建议在局部变量上使用变量跟踪。它们比全局/命名空间变量具有更多的开销(和内部复杂性)。