TCL:一个过程可以在另一个过程中运行并在没有upvar的情况下共享它们之间的所有变量吗?

时间:2015-02-24 07:43:41

标签: tcl procedure

我想说:

proc set_valid {} {
    set valid 1
    puts "$printme"
}

proc valid_start {} {
    set valid 0
    set printme "ABC"
    valid_stop
    return valid
}

valid_start将返回1,我可以在不使用upvar的情况下使用它吗?所有变量都将在procs之间共享?

我只想要以下内容,

proc valid_start {} {
    set valid 0
    set printme "ABC"
    ####
    set valid 1
    puts "$printme"
    ####
    return valid
}

只是为了能够重复某些代码行,就像“source”一样对.tcl文件,但是对同一个.tcl中的特定代码块,我可以这样做吗?

2 个答案:

答案 0 :(得分:3)

每个程序都有自己的局部变量;引用调用者过程的局部变量,您必须使用upvar(或uplevel运行命令以在正确的范围内操作它们。)

proc set_valid {{printme "the message"}} {
    upvar 1 valid valid
    set valid 1
    puts "$printme"
}

globalvariable命令非常相似,但(通常)分别用于引用全局变量和当前命名空间变量。

使用该过程定义,您可以执行以下操作:

proc valid_start {} {
    set valid 0
    set printme "ABC"
    # Stuff...

    set_valid $printme

    # I guess you want to return the variable contents, not the name?
    return $valid
}

您也可以通过相同的机制传输printme变量(见下文),但我建议将“神奇可用”变量的数量保持在最低限度;如果变量按值发送,由显式传递的名称发送,或者在globalvariable(在适当的情况下)在顶部声明,则更清晰,更易于维护。

proc set_valid {} {
    # Emphasising that local variable names are different to the caller's names
    upvar 1 valid abc printme def
    set abc 1
    puts "$def"
}
proc valid_start {} {
    set valid 0
    set printme "ABC"
    # Stuff...
    set_valid
    return $valid
}

如果您希望自己的程序像source那样工作,请使用uplevel 1

proc set_valid {} {
    uplevel 1 {
        set valid 1
        puts "$printme"
    }
}

你是如何做类似宏观的事情的。如果您需要在此执行代码生成,list命令非常有用。如果您想了解更多信息,请在Stack Overflow上询问另一个独立问题。

答案 1 :(得分:2)

您可以尝试使用命令info和eval来实现您尝试做的事情。但是在软件工程视图中,我不建议这样做,你有点超越功能的目的

proc proc1 {} {
    set valid 1
}

proc proc2 {} {
    set valid 0
    set code [info body proc1]
    eval $code
    puts $valid
}

proc2