Debugging 如果我忘记关闭打开的大括号';{';使用右大括号';}';

Debugging 如果我忘记关闭打开的大括号';{';使用右大括号';}';,debugging,tcl,Debugging,Tcl,我对tcl没有太多的经验,但是当我今天写几个测试用例时,突然编译器不停地说缺少“}”,我必须通过至少50到60对括号来确保所有的测试都是正确的,在这个错误上花了大约1.5个小时之后,我发现我忘了用一个'}' 下面是我评论中的代码 #test XmlDAOTest-1.15 {Test XmlDAO - method - 'ProcessCDATASectionNode'\ 因此,如果您看到的话,我已经对行进行了注释,并且我没有用“}”关闭它,因为注释不应该被编译和语法检查,只有在我在编译器给出

我对tcl没有太多的经验,但是当我今天写几个测试用例时,突然编译器不停地说缺少“}”,我必须通过至少50到60对括号来确保所有的测试都是正确的,在这个错误上花了大约1.5个小时之后,我发现我忘了用一个'}' 下面是我评论中的代码

#test XmlDAOTest-1.15 {Test XmlDAO - method - 'ProcessCDATASectionNode'\
因此,如果您看到的话,我已经对行进行了注释,并且我没有用“}”关闭它,因为注释不应该被编译和语法检查,只有在我在编译器给出结果的“\”之后附加了“}”之后。我正在使用下面的

IDE - Eclipse Indigo  Version of Tcl - Tcl/Tk 8.5 with tclOO  

Version: Indigo Service Release 2  Tcltest, tDom all included 

Build id: 20120216-1857

我想知道这是IDE方面的一个缺陷,还是TCL/Tk固有的缺陷,以及它是否是TCL中的一个问题,您是否遇到过类似的问题。

行末尾的“\”也是一个延续标记,因此它可能会将下一行拖到注释中

e、 g


将输出3,因为第2行被视为注释的一部分。

您看到的问题是由于Tcl,而不是您的IDE。也就是说,这不是Tcl的“问题”,只是代码如何解析的一个工件。在Tcl中,has符号仅在启动命令有效的位置启动注释,因此,注释需要与代码的其余部分同时解析。因为代码没有经过“预处理”来删除注释,所以引号和大括号需要平衡

要举例说明为何以这种方式进行解析,请执行以下操作:

set x #abc
在上行中,x的值是
#abc
。如果对注释进行预处理,上述内容将转换为仅
setx
,其余内容将消失

同样的道理,还有另一个地方,很多人都会被评论咬到:

switch -exact -- $myvalue {
    # this is not a comment
    "a value" { do something }
    "another value { do something }
}
在上述情况下,
#
a为开关箱;你也可以这样看(这是一样的)


这是因为switch语句中查找大小写值的位置不是命令的有效位置。同样地,
#
只是一个普通字符,与其他字符一样。

哇,你是对的,但是在阅读了你的答案后,我尝试了同样的事情,没有使用延续标记,但仍然会给我一个错误。我只是输入了“#这是一个测试用例{”,如果我不使用“}关闭它,我仍然会得到同样的错误'也许你应该试一试。'是否有一个'}'应该关闭注释中没有注释的那一个?可能需要多看几行代码。这是事实,但是如果在一对外部大括号内,缺少
}
仍然会导致问题(因为它们需要平衡以满足外部大括号计数处理规则的简单性)。我的经验法则是“永远保持牙套的平衡,即使你不需要。”哦!好啊由于我是一名新生,我唯一的经验是使用“C”和“CPP”,我不确定这是与TCL还是与编译器有关,因为如果编译器对我的代码感到疯狂,那就意味着我浪费了近90个小时的工作:-)许多IDE并不真正理解TCL真正的注释规则,因为它们与大多数语言都有细微的不同。那里也没有真正的变化前景……原因在Tcl维基中有描述:计算机语言!呵呵!,最近,我意识到我学习编程语言的方法是多么错误。尝试一些事情,遇到一些问题,试着找出问题的原因,然后来寻求帮助。在我看来,学习新语言还有更糟糕的方法
switch -exact -- $myvalue {
    # this is not a comment
    "a value" { do something }
    "another value { do something }
}
switch -exact -- $myvalue {
    "#" { this }
    "is" { not } 
    "a" { comment }
    "a value" { do something }
    "another value" { do something }
}