我正在使用 Sentaurus TCAD 进行半导体器件模拟,并且我在 .cmd 文件(从特定工具执行的 tcl 中的脚本)中遇到了与“#”的使用相关的一些我无法理解的内容。
众所周知,‘#’是在tcl中用来发表评论的。如果您将“#”放在行首,则您键入的所有内容直到“;”否则换行符将被注释掉。例如:
#This is a comment and everything on this line is treated as such.
puts "Hello world" ; #This is a comment and everything after right of ';' is treated as such on this line.
我在脚本中发现了一种表达 if-else 语句的特殊方式:
#if <condition>
<commands>
#else
<commands>
#endif
我用通常的 tcl if-else 语句替换了该块:
if {<condition>} {
<commands>
} else {
<commands>
}
当然它仍然有效,但我想知道为什么解释器不将 #if 视为注释? #if #else #endif 语法从何而来?我在网上没有找到任何关于它的文档,只报告了常用的语法。
如果 Tcl 解析器在查找命令第一个单词的第一个字符时看到
#
(或者在扩展格式正则表达式中,或者从 8.7/9.0 开始,在表达式内的许多点) ,那么从该点到该行末尾就是一条注释。请注意,在像 proc
这样的命令主体中,Tcl 解析器不 寻找命令,至少在定义过程时不会;它仅在计算过程时(或者更确切地说,当它被编译为字节码时,通常在第一次调用进入之前立即查看)。括号匹配器很愚蠢,但却是 Tcl 工作原理的基本部分;解析在概念上非常晚(但对于大多数代码来说在实践中更早)。事实上,整个解析器非常简单;我们提供的命令都只是一个标准库。 这意味着
#
确实是一个正确的注释语法形式,但无论如何你可能需要平衡其中的括号,至少在包含像
proc
这样的东西的整体层面上。到处这样做是个好习惯。这有效:
# if {$code == 1
puts "I'm printing this anyway"
就像这样:
proc foo args {
# if {$code == 1} {
puts "I'm printing this anyway"
# }
}
但这不是:
proc foo args {
# if {$code == 1
puts "I'm printing this anyway"
}
# }
您可以通过简单地计算未完成的括号对的数量来预测这一点。不需要更复杂的概念。