TCL:一个过程是否可以在另一个过程中运行,并在没有upvar的情况下在它们之间共享所有var



让我们说我想要:

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的情况下使用它吗?所有变量将在proc之间共享?

我只想换一个

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

只是为了能够像"源代码"一样重复一些代码行到.tcl文件,但重复到同一.tcl中的特定代码块,我能做到吗?

每个过程都有自己的局部变量;要引用调用程序过程的局部变量,必须使用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
}

如果你想让你的程序像sourced一样工作,请使用uplevel 1

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

这就是你做类似宏观的事情的方式。如果您需要在其中生成代码,list命令非常有用。如果您想了解更多信息,请在Stack Overflow上提出另一个独立问题。

你可以尝试使用命令info和eval来实现你想要做的事情。但从软件工程的角度来看,我不建议这样做,你有点违背了函数的目的

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

相关内容

最新更新