TCL手册页:最好将评论部分放在前面

时间:2017-07-04 04:41:21

标签: tcl

我知道我在这里真的很挑剔,但是如果我在解释TCL man page时不知情的话就把它丢掉,实际上,我希望我在这里错了,你看下面的故事。 / p>

因此,对于每个新的TCL开发人员,我们建议您阅读着名的" 11规则" (现在是12条规则)。

昨天有人问我这个问题:为什么以下脚本会失败?

# puts "hello
world!"

当然,它失败了,我说,第一行被视为注释,将world!"作为命令。

但是,新手说,联机帮助页指示脚本按特定顺序解析:

  1. #2 Evaluation所述,该命令首先被解析为单词。
  2. 作为#4 Double quotes状态,换行符与解析双引号一样。这会将helloworld!合并为一个单词,中间有换行符。
  3. Comments at #10会在忽略下一个换行符之前说明所有内容,但经过上述处理后,换行符应为第二个换行符,即world!之后的换行符。
  4. 我知道他有一点意见。

    在手册页中将注释部分向前移动更有意义,可能在第二部分。通过此订单更改,它表示注释识别位于单词标记化过程之前。

    您怎么看?

    同样,我无意要求更改联机帮助页,只是想确定我在解释圣经时是否遗漏了任何内容。

    [更新] 对于那些建议将这个问题视为非技术性问题的人来说,就像我的同事来到这里询问为什么该脚本失败,即使他对TCL手册页的理解表明它是一个好的脚本也是如此。

    同样,我不是要求更改手册页。

    让我重新说出我的问题 - 当你被问到同样的问题时,你在他的推理中看到了什么缺陷?

    [UPDATE2] 谢谢唐纳德。我认为这就是我所学到的,TCL解析器一个接一个地烧掉,没有预见。

    这是另一个例子:

    puts [#haha]
    

    由于同样的原因,这样的脚本在tclsh失败,TCL解析器不会先破坏脚本,只解析嵌入在匹配括号内的字符串,而是识别"#"作为评论的开始,忽略了之后的一切。

1 个答案:

答案 0 :(得分:0)

Tcl(n)手册页中的规则非常精确地描述了Tcl使用的解析器。实质上改变它的要求通常被否定,因为它们往往具有深远的影响并且相互之间相互作用。验证规则的重新排序不是实质性的是一项非常重要的任务,因为它们对应于相当多的代码(我们的解析器和我们的字节码编译器的一大块)。

添加非规范性部分(例如,示例)更容易。

根据您更新的问题进行更新

推理的问题在于规则是整个,而不是真正的分层组件。他们确实互相交流。 (通常绊倒人的是支撑规则和注释规则之间的交互,当在一个支撑字符串中时,例如一个过程体。)注释确实是真正的注释,并延伸到最后该行(允许反斜杠 - 换行序列)但不超出,但它们只从命令开始的地方开始,而不是在#字符的其他地方开始,这是真正棘手的一点。

不幸的是,Tcl解析器的工作方式与程序员的思维方式略有不同,但大部分时间它都假装以“合理的方式”工作。除了处理上面提到的大括号 - 评论交互之外,棘手的边缘情况实际上并不经常出现。我点击的其他案例往往是switch(仅通过将评论放在手臂中可解析)或者我想要评论列表某些部分的长文字列表;在后一种情况下,我实际上在将字符串用作列表之前对字符串进行后处理。

set exampleList {
    a b c
    d e f
    # Not really a comment but I want to use it like one!
    g h i
    j k l
}
# Convert “comment” lines to empty lines
regsub -all -line "^\\s*#.*$" $exampleList "" exampleList

Tcl规则的一般优点是在Tcl中嵌入其他语言实际上非常容易,正是因为Tcl只将#(和其他字符)视为定义明确的上下文中的特殊内容。只要你能够使用嵌入式语言来使用平衡括号 - 而且几乎所有这些都在实践中 - 那么嵌入它就完全是微不足道的。其他案例必须使用反斜杠和/或双引号,并且非常难看,但也是所有嵌入案例中的一小部分。

你的同事的问题是他一次看整个脚本,而Tcl解析器一次处理一个字符,并没有做有意义的前瞻。这只是一些愚蠢的代码。