我已经使用Tcl语言2个月了。我有一个问题:什么是[list source file]
的意思?我分别理解source
和list
,但当它们放在一起时,我不知道它们的含义。
这似乎是使用list
进行命令脚本构建。我敢打赌,[list source file]
的结果随后会与uplevel
或namespace eval
一起使用。或者甚至是interp eval
。
list
命令生成列表。它还生成无需替换的命令,例如:
eval [list $a $b]
实际上,它的行为与以下内容完全相同:
$a $b
source
而不是$a
,并且使用file
(我敢肯定不是那么字面意思)而不是$b
。为什么这样做呢?这确保了如果文件名中有Tcl元字符(例如{
),那么用于源文件的创建脚本在评估时不会出现任何问题。source file
呢?嗯,最有可能的情况是您想要将source
用于当前上下文之外的上下文; source
命令将文件读入字符串,然后有效地对该字符串执行立即eval
(好吧,有一些细微差别,但与此非常接近)。特别是:proc foo {} {
source bar.tcl
}
将 bar.tcl
的内容在 foo 过程体内运行,就好像你直接在里面输入这些文本一样。变量将是局部变量(除非你使用 global
或类似的东西),等等。坦率地说,大多数人不会写像这样的 Tcl 脚本;为了处理这个问题并在定义的上下文中评估代码,实际上应该编写:
proc foo {} {
# Quoted to defeat the Stack Overflow syntax highlighter only!
uplevel "#0" [list source bar.tcl]
}
package ifneeded foo 1.0 [list source [file join $dir foo.tcl]]
也是一个例子。 - undefined