Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Tcl中的变量范围和源命令_Variables_Tcl_Scope - Fatal编程技术网

Variables 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命令在脚本运行的上下文中评估从指定文件读取的脚本;在您的情况下,这个上下文也是全局的,因此您的放置是有效的 关于练习的问题更为复杂,因为它很大程度上取决于你实际做了什么。源代码命令的工作方式几乎就像

我有以下两个文件: a、 tcl:

b、 tcl:

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...
}