在TCL中重命名置入名称空间导致问题

时间:2016-01-18 11:18:33

标签: tcl

当我尝试在名称空间内重命名puts命令时,它会导致问题。我正在重命名puts,因为我不想显示特定过程的echo语句。

namespace eval temp {
    namespace export print_proc
    proc replacement_puts args {}
    proc silentEval {script} {
        rename puts original_puts
        interp alias {} puts {} temp::replacement_puts
        catch [list uplevel 1 $script] msg opts
        rename puts {}
        rename original_puts puts
        return -options $opts $msg
    }
    proc print_proc {} {
        puts "before call"
        silentEval {a}
        puts "aftter call"
    }
    proc a {} {
        puts "inner call"
    }
}

package provide temp 1.0

在示例中,我不想显示proc a的回声语句。

但执行后,它显示错误Invalid Command Name "puts"

由于

2 个答案:

答案 0 :(得分:3)

格伦杰克曼的回答应该可以解决你的问题。我只是想指出你真的不需要重命名任何东西。有了这个定义:

namespace eval temp {
    namespace export print_proc
    proc puts args {}
    proc silentEval script {
        catch [list uplevel 1 $script] msg opts
        return -options $opts $msg
    }
    proc print_proc {} {
        ::puts "before call"
        silentEval a
        ::puts "aftter call"
    }
    proc a {} {
        puts "inner call"
    }
}

当调用a并调用puts时,它实际上会优先调用::temp::puts命令而不是全局puts - 实际上是名称空间{{ 1}}覆盖全局puts。在puts我们希望调用全局print_proc,因此我们在名称前添加puts

当然,所有这些都适用于::中定义的脚本,如示例中所示。

(如果您要重新抛出异常,调用::temp并没有多大意义,但我想这只是占位符代码。)

文档:catchlistnamespaceprocputsreturn

答案 1 :(得分:1)

您必须明确表示您正在改变全球get_the_title();

puts