Variables Tcl中的变量范围和源命令
我有以下两个文件: a、 tcl: b、 tcl:Variables Tcl中的变量范围和源命令,variables,tcl,scope,Variables,Tcl,Scope,我有以下两个文件: a、 tcl: b、 tcl: if {$condition} { puts "hello" } 当我运行a.tcl时,它会打印“hello”。这是访问a.tcl中定义的变量的正确做法吗?b.tcl中$condition的范围是什么?谢谢。条件的范围是全局的。source命令在脚本运行的上下文中评估从指定文件读取的脚本;在您的情况下,这个上下文也是全局的,因此您的放置是有效的 关于练习的问题更为复杂,因为它很大程度上取决于你实际做了什么。源代码命令的工作方式几乎就像
if {$condition} {
puts "hello"
}
当我运行a.tcl时,它会打印“hello”。这是访问a.tcl中定义的变量的正确做法吗?b.tcl中$condition的范围是什么?谢谢。条件的范围是全局的。
source
命令在脚本运行的上下文中评估从指定文件读取的脚本;在您的情况下,这个上下文也是全局的,因此您的放置是有效的
关于练习的问题更为复杂,因为它很大程度上取决于你实际做了什么。源代码
命令的工作方式几乎就像它将文件读入字符串,然后将其传递给eval
(唯一的微妙之处在于信息脚本
)。这意味着执行源代码的范围将是脚本最外层的求值范围,因此您可以将条件作为局部变量:
proc funkystuff {condition} {
source b.tcl
}
funkystuff true
这将起作用(事实上,这对于Tcl的包定义脚本的工作方式至关重要;它们是在一个局部变量$dir
描述包定义的位置的上下文中进行评估的),但它肯定会导致代码混乱!
因此,编写脚本是一种很好的做法,这样脚本中的代码就不会对它在什么上下文中求值做出任何假设。最简单的方法通常是将代码放入命名空间内的脚本中,其中命名空间的名称是完全限定的
namespace eval ::foobar {
# Do stuff here...
}
尝试编写在寻源时没有过度参数化的代码也是一件好事,而不是保存加载的代码版本(例如,一个文件用于Linux,另一个文件用于Windows)或传递给命令的参数。当然,您不必以这种方式工作,但它确实有助于使您的代码健壮且易于理解
最后,Tcl解释器主脚本使用的作用域始终在全局级别进行评估(即,在:
命名空间中,没有父作用域)
namespace eval ::foobar {
# Do stuff here...
}