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

TCL:一个过程是否可以在另一个过程中运行并在没有upvar的情况下共享它们之间的所有变量?,tcl,procedure,Tcl,Procedure,假设我想要: proc set_valid {} { set valid 1 puts "$printme" } proc valid_start {} { set valid 0 set printme "ABC" valid_stop return valid } 有效的_start将返回1,我可以在没有upvar的情况下使用它吗?所有变量将在进程之间共享 我只想做以下几件事 proc valid_start {} { set va

假设我想要:

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

proc valid_start {} {
    set valid 0
    set printme "ABC"
    valid_stop
    return valid
}
有效的_start将返回1,我可以在没有upvar的情况下使用它吗?所有变量将在进程之间共享

我只想做以下几件事

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"
}
global和variable命令非常相似,但通常分别用于引用全局变量和当前名称空间变量

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

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变量,但我建议将“神奇可用”变量的数量保持在最低限度;如果变量是按值发送的、按显式传递的名称发送的,或者在适当的情况下在顶部用全局变量或变量声明的,则更清晰、更易于维护

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
}
如果您想让您的程序像源代码一样工作,请使用uplevel1


你就是这样做的。如果您需要在这种情况下生成代码,list命令非常有用。如果您想了解更多信息,请在此询问另一个有关堆栈溢出的独立问题。

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

proc set_valid {{printme "the message"}} {
    upvar 1 valid valid
    set valid 1
    puts "$printme"
}
global和variable命令非常相似,但通常分别用于引用全局变量和当前名称空间变量

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

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变量,但我建议将“神奇可用”变量的数量保持在最低限度;如果变量是按值发送的、按显式传递的名称发送的,或者在适当的情况下在顶部用全局变量或变量声明的,则更清晰、更易于维护

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
}
如果您想让您的程序像源代码一样工作,请使用uplevel1


你就是这样做的。如果您需要在这种情况下生成代码,list命令非常有用。如果您想了解更多信息,请在此询问另一个有关堆栈溢出的独立问题。

您可以尝试使用命令info和eval来了解您正在尝试执行的操作。但从软件工程的角度来看,我不建议这样做,你有点违背了函数的目的

proc proc1 {} {
    set valid 1
}

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

proc2

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

proc proc1 {} {
    set valid 1
}

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

proc2