让我们说我想要:
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"
}
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
}
如果你想让你的程序像source
d一样工作,请使用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