对于我来说,这在 Tcl 中似乎是非常奇怪的行为,或者这是正常的,只是我不明白注释是如何工作的?
该代码在 Tcl 中运行良好:
#foreach corner {1 2} {
#if { $a } {
#}
好的,实际上什么都没有运行,但我没有收到任何错误。但如果我注释掉循环命令,则循环内的注释行会导致错误:
foreach corner {1 2} {
#if { $a } {
}
Tcl 解释器(tclsh)说:
missing close-brace: possible unbalanced brace in comment
while executing
"foreach corner {1 2} {"
(file "test.tcl" line 1)
只是为了完整性,我应该提到,当我删除该注释行时,错误就消失了。
这是正常的吗?在开发代码时有没有更好的方法来“注释掉”行?如何让解释器完全忽略注释中的内容?
在 Tcl 中,
{ ... }
不是一个代码块——它是一个字符串文字,与 是同一类型的东西,"..."
只是具有不同的“特殊字符”规则(没有变量扩展等)。例如,这两个是等效的:
与传统的
"
-strings 不同,在 -strings 中你必须转义每个嵌入的引号(例如"abc\"def"
),而 -string 中的规则之一{}
是它可以包含未加引号的括号,只要它们是匹配的;也就是说,}
如果解析器在它之前看到一些 ,那么 a 不一定终止字符串{
。因此你可以拥有:相比:
但是,解析器中没有关于
#
字符串文字内的注释的规则:这只是字符串中的另一个常规字符。稍后,当字符串作为 for 循环体执行时(此时其内容被再次解析),它才会成为一条注释,但是现在
#
对于最外层的解析器来说,它毫无意义,并且该行中的每个{
“和”}
仍然被计算在内。因此,如果 {} 字符串中存在不平衡
{
,则可能需要将其\{
暂时更改为。(反斜杠实际上成为字符串值的一部分,但在这种情况下不会造成影响。)