让我说我想:
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 valid_start {} {
set valid 0
set printme "ABC"
####
set valid 1
puts "$printme"
####
return valid
}为了能够重复一些代码行,就像对.tcl文件执行“源代码”一样,但对同一个.tcl中的特定代码块,我能这样做吗?
发布于 2015-02-24 09:36:08
您可以尝试使用命令信息和eval来实现您想要做的事情。但从软件工程的角度来看,我不会再这样做了,你有点超出了函数的目的
proc proc1 {} {
set valid 1
}
proc proc2 {} {
set valid 0
set code [info body proc1]
eval $code
puts $valid
}
proc2发布于 2015-02-24 09:12:16
每个过程都有自己的局部变量;要引用调用过程的局部变量,必须使用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变量,但我建议将“神奇可用”变量的数量保持在最低限度;如果变量是通过值发送的,通过显式传递的名称发送,或者使用global或variable (在适当的情况下)在顶部声明的话,则更加清晰和可维护。
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命令非常有用。如果你想了解更多,在这里问另一个关于堆栈溢出的独立问题。
https://stackoverflow.com/questions/28690489
复制相似问题