Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重载标准Tcl命令_Tcl - Fatal编程技术网

重载标准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:我猜是“它不起作用;为什么?救命!”某种程度上掩盖了它。