我想说:
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中的特定代码块,我可以这样做吗?
答案 0 :(得分:3)
每个程序都有自己的局部变量;引用调用者过程的局部变量,您必须使用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
那样工作,请使用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