【发布时间】:2017-12-07 09:46:30
【问题描述】:
我知道我在这里真的很挑剔,但是我想把它扔掉,以防我在解释 TCL man page 时出错,实际上,我希望我在这里错了,就像你看到下面的故事一样。
所以对于每一个新的 TCL 开发者,我们推荐阅读著名的“11 条规则”(现在是 12 条规则)。
昨天有人问我这个问题:为什么下面的脚本会失败?
# puts "hello
world!"
当然失败了,我说,第一行作为注释,留下world!"作为命令。
但是,新手说,手册页表明该脚本是按特定顺序解析的:
- 正如#2 Evaluation 所说,命令首先被解析为单词。
- 正如#4 Double quotes 所说,在解析双引号时会采用换行符。这使得
hello和world!成为一个单词,中间有一个换行符。 -
Comments at #10 确实声明了直到下一个换行符被忽略的所有内容,但经过上述处理,换行符应该是第二个换行符,即
world!之后的那个。
我知道他说的有道理。
在手册页中将注释部分向前移动更有意义,也许在第二部分。随着这个顺序的改变,它表明评论识别在词标记化过程之前。
你怎么看?
再次,我无意要求更改联机帮助页,只是想确定我在解释圣经时是否遗漏了什么。
[更新] 对于建议将此问题作为非技术问题结束的人来说,就像我的同事来到这里询问为什么该脚本失败,即使他对 TCL 手册页的理解表明它是一个很好的脚本。
同样,我并不是要更改手册页。
让我重新表述我的问题 - 当你被问到同样的问题时,你认为他的推理有什么缺陷?
[更新2] 谢谢多纳尔。我想这就是我学到的,TCL 解析器一个接一个地处理,没有前瞻。
这是另一个例子:
puts [#haha]
出于同样的原因,此类脚本在 tclsh 失败,TCL 解析器不会首先分解脚本,而只会解析嵌入匹配括号内的字符串,而是将“#”识别为注释的开头并忽略其后的所有内容。
【问题讨论】:
-
最大的问题是
#不是命令,而是开始评论。另一个例子是# foo [bar]-bar没有被调用。如果#是一个命令,那么它将首先评估[bar]。 -
另外请注意,cmets 的描述说“如果哈希字符 (
#) 出现在 Tcl 期望命令的第一个单词的第一个字符的位置,那么哈希字符和它后面的字符,一直到下一个换行符,都被视为注释并被忽略。” - 正如我们已经看到的,注释不是命令。我同意,第 1 点(定义 Tcl 脚本)可以包括 cmets。 -
我投票决定将此问题作为题外话结束,因为这是更改 tcl 项目的请求,而不是一个需要技术解决方案的问题
标签: tcl