Tcl评论:为何解释评论?

Dur*_*tta 1 language-agnostic scripting interpreter tcl

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

注释:如果#出现在预期命令的位置,则该行的其余部分是注释.未尝试执行命令,并且不会解释行中的任何字符,除非终止换行符可以使用\进行转义,表示注释在后续行继续.

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

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

test
Run Code Online (Sandbox Code Playgroud)

Ť

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

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

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

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

Don*_*ows 5

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

这些将作为评论:

proc commentDemonstration {} {
    puts "A"
    # if [exit] {
        puts "B"
    # } else [exit]
    puts "C"
}
# Call it and see, _no_ early exit
commentDemonstration
Run Code Online (Sandbox Code Playgroud)

他们是真正的评论.只是你必须在程序定义中平衡(或反斜杠引用)大括号(除非你疯狂到在双引号或其他东西中定义一个过程体; 不要为了你自己的理智而这样做),而不管是什么你使用的评论.大多数时候你没有注意到平衡要求,但这是一个重要的案例.


能够放入这样的#东西是在Tcl中嵌入其他语言的关键.例如,Critcl允许C源代码嵌入在Tcl中,并且#意味着在C中完全不同.