在 TCL 中使用 # 来执行命令

问题描述 投票:0回答:1

我正在使用 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 comments
1个回答
0
投票

如果 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" } # }
您可以通过简单地计算未完成的括号对的数量来预测这一点。不需要更复杂的概念。

© www.soinside.com 2019 - 2024. All rights reserved.