Tcl评论:为何解释评论?

时间:2015-01-24 17:03:23

标签: scripting language-agnostic tcl interpreter

在Tclers wiki页面,'Dodeklogue'提到了评论:

  

评论:       如果#出现在预期命令的位置,则该行的其余部分是注释。没有尝试执行命令,也没有执行任何字符   解释行,但终止换行符可能是   转义为\,表示评论继续在   后续行。

但是,评论似乎是由终端\解释的:例如,让文件test.tcl的内容如下:

proc test {} {
    # Open brace {
    puts "I am fine"
}

test

然后 tclsh test.tcl给出以下错误消息:

missing close-brace: possible unbalanced brace in comment
    while executing
"proc test {} {"
    (file "hello.tcl" line 1)
Even more interesting

更有趣的是,当用括号{替换左括号}时,错误信息完全不同。

为什么Tcl解释器试图理解注释中的内容,如果Tcl解释器(或任何一般的解释器)被设计为将注释作为真实注释,我们会失去什么:一旦看到{{1}完全忽略直到换行(除了检查注释的最后一个字符,如果它是#)?

1 个答案:

答案 0 :(得分:5)

与许多其他语言不同,Tcl与其余语法同时处理注释。这意味着,因为它首先遇到{(作为proc命令调用的一部分),所以它专注于匹配大括号。它只是在{em>评估过程时将#理解为注释(即,您调用proc命令定义的命令)。

这些将作为评论:

proc commentDemonstration {} {
    puts "A"
    # if [exit] {
        puts "B"
    # } else [exit]
    puts "C"
}
# Call it and see, _no_ early exit
commentDemonstration

他们是真正的评论。只是你必须在程序定义中平衡(或反斜杠引用)大括号(除非你疯狂到足以在双引号或其他内容中定义程序体; don&# 39;为了你自己的理智而这样做 ,与你使用的评论无关。大多数时候你没有注意到平衡要求,但这是重要的一个案例。


能够将#放在这样的东西中是将其他语言嵌入到Tcl中的关键。例如,Critcl允许C源代码嵌入在Tcl中,#表示C中完全不同的东西。