重载标准Tcl命令
程序的小查询相关范围重载标准Tcl命令,tcl,Tcl,程序的小查询相关范围 proc lappend {args} { set a $args lappend a testing ;# want to call the inbuilt tcl lappend command puts "$a" } set list {new to tcl} lappend $list 如果你这么做,那就行不通了。它将取代标准的lappend,您将得到一个无限递归(您将进行堆栈深度检查)。有几种方法可以解决这个问题 将代码放入命名空间中 如果代
proc lappend {args} {
set a $args
lappend a testing ;# want to call the inbuilt tcl lappend command
puts "$a"
}
set list {new to tcl}
lappend $list
如果你这么做,那就行不通了。它将取代标准的
lappend
,您将得到一个无限递归(您将进行堆栈深度检查)。有几种方法可以解决这个问题
将代码放入命名空间中
如果代码位于命名空间中,它将首先解析该命名空间中的lappend
,并且仅在本地搜索失败时使用全局命名空间。您可以这样使用:
namespace eval myNS {
proc lappend {args} {
set a $args
::lappend a testing ;# Force the use of the global lappend command
puts "$a"
}
set list {new to tcl}
lappend $list
}
rename lappend lappend_original
proc lappend {args} {
set a $args
lappend_original a testing
puts "$a"
}
set list {new to tcl}
lappend $list
在这一点上可能有一些变化,名称空间eval myNS{source example.tcl}
(源文件中的代码几乎是一字不差的)是一个更有趣的变量,因为它允许代码对名称空间基本不可知
重命名全局lappend
命令
也可以将标准命令移到一边,如下所示:
namespace eval myNS {
proc lappend {args} {
set a $args
::lappend a testing ;# Force the use of the global lappend command
puts "$a"
}
set list {new to tcl}
lappend $list
}
rename lappend lappend_original
proc lappend {args} {
set a $args
lappend_original a testing
puts "$a"
}
set list {new to tcl}
lappend $list
只要您没有太多的代码争夺谁拥有实际的原始命令,这种技术就可以正常工作。多年来,许多Tcl脚本都在使用它
真正问题的解决方案:执行跟踪
当然,lappend
命令并不是您真正想要替换的命令,因为它在许多Tcl库代码中被大量使用。对于找出一段代码实际在哪里调用lappend
以及传入了哪些参数的问题,使用。(此处的链接指向Tcl 8.6文档,但此API自Tcl 8.4以来就已经存在,因此您应该可以使用它。)
如果你这么做,那就行不通了。它将取代标准的
lappend
,您将得到一个无限递归(您将进行堆栈深度检查)。有几种方法可以解决这个问题
将代码放入命名空间中
如果代码位于命名空间中,它将首先解析该命名空间中的lappend
,并且仅在本地搜索失败时使用全局命名空间。您可以这样使用:
namespace eval myNS {
proc lappend {args} {
set a $args
::lappend a testing ;# Force the use of the global lappend command
puts "$a"
}
set list {new to tcl}
lappend $list
}
rename lappend lappend_original
proc lappend {args} {
set a $args
lappend_original a testing
puts "$a"
}
set list {new to tcl}
lappend $list
在这一点上可能有一些变化,名称空间eval myNS{source example.tcl}
(源文件中的代码几乎是一字不差的)是一个更有趣的变量,因为它允许代码对名称空间基本不可知
重命名全局lappend
命令
也可以将标准命令移到一边,如下所示:
namespace eval myNS {
proc lappend {args} {
set a $args
::lappend a testing ;# Force the use of the global lappend command
puts "$a"
}
set list {new to tcl}
lappend $list
}
rename lappend lappend_original
proc lappend {args} {
set a $args
lappend_original a testing
puts "$a"
}
set list {new to tcl}
lappend $list
只要您没有太多的代码争夺谁拥有实际的原始命令,这种技术就可以正常工作。多年来,许多Tcl脚本都在使用它
真正问题的解决方案:执行跟踪
当然,lappend
命令并不是您真正想要替换的命令,因为它在许多Tcl库代码中被大量使用。对于找出一段代码实际在哪里调用lappend
以及传入了哪些参数的问题,使用。(此处的链接指向Tcl 8.6文档,但此API自Tcl 8.4以来就已经存在,因此您应该可以使用它。)
@ShiDoiSi:我猜是“它不起作用;为什么?救命!”某种程度上掩盖了它。@ShiDoiSi:我猜是“它不起作用;为什么?救命!”某种程度上掩盖了它。