如何在其他命名空间中将变量设置为等于过程中的变量?

时间:2014-04-19 09:32:31

标签: tcl

我有TCL代码:

namespace eval gen {
    proc generate { } {
        set language "C"
        namespace eval current_file_generation_info {
            variable language $language
        }
    }
}

在第variable language $language行我尝试将名称空间language中的变量current_file_generation_info设置为过程language内的变量generate的值。我的代码给了我一些错误,比如“语言变量不存在”,我明白为什么会这样做。

所以我的问题是,如何在language过程中将命名空间current_file_generation_info中的变量language设置为等于变量generate

2 个答案:

答案 0 :(得分:1)

namespace eval gen {
    proc generate { } {
        set language "C"
        set [namespace current]::language $language
    }
    generate
    variable language
    puts $language
}

避免对本地var和命名空间var

使用相同的变量名更为清楚
namespace eval gen {
    proc generate { } {
        variable language
        set _language "C"
        set language $_language
    }
}

或者只是省略本地var

namespace eval gen {
    proc generate { } {
        variable language
        set language "C"
    }
}

答案 1 :(得分:1)

最简单的方法是在variable调用中命名目标命名空间,但是如果这样做,则应该将命名空间作为单独的步骤(如果可以在某个时刻调用代码) NS尚未创建。)

namespace eval gen {
    proc generate { } {
        # Make the namespace by running an empty script in it
        namespace eval current_file_generation_info {}
        # Initialise the variable
        variable current_file_generation_info::language "C"
    }
}

否则,您可以这样做:

namespace eval gen {
    proc generate { } {
        namespace eval current_file_generation_info \
                [list variable language "C"]
    }
}

提示:list命令非常擅长生成调用单个命令的无替换脚本。