Scripting Tcl评论:为什么要解读评论?

Scripting Tcl评论:为什么要解读评论?,scripting,language-agnostic,tcl,interpreter,Scripting,Language Agnostic,Tcl,Interpreter,在Tclers wiki页面中,提到了关于评论的内容: proc commentDemonstration {} { puts "A" # if [exit] { puts "B" # } else [exit] puts "C" } # Call it and see, _no_ early exit commentDemonstration 评论: 如果#出现在需要命令的位置,则该行的其余部分为注释。未尝试执行任何命令,并且 除了终止换行符可

在Tclers wiki页面中,提到了关于评论的内容:

proc commentDemonstration {} {
    puts "A"
    # if [exit] {
        puts "B"
    # } else [exit]
    puts "C"
}
# Call it and see, _no_ early exit
commentDemonstration
评论: 如果#出现在需要命令的位置,则该行的其余部分为注释。未尝试执行任何命令,并且 除了终止换行符可能是 转义为\,表示评论在 下一行

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

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

test
t

然后
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解释器(或任何解释器)被设计为将注释视为真实注释,我们会失去什么:一旦看到
完全忽略,直到新行出现(除了,如果注释的最后一个字符是
\
),检查注释的最后一个字符?

{(作为
proc
命令调用的一部分),所以它将重点放在匹配大括号上。它只在评估过程时将
#
理解为注释(即,调用
proc
命令定义的命令)

这些将作为评论:

proc commentDemonstration {} {
    puts "A"
    # if [exit] {
        puts "B"
    # } else [exit]
    puts "C"
}
# Call it and see, _no_ early exit
commentDemonstration
它们是真正的注释。只是你必须平衡(或反斜杠引用)过程定义中的大括号(除非你疯狂到用双引号或其他什么来定义过程主体;为了你自己的理智,不要这样做)与你使用的注释无关。大多数时候你都没有注意到平衡要求,但这是一个重要的例子



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

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

这些将作为评论:

proc commentDemonstration {} {
    puts "A"
    # if [exit] {
        puts "B"
    # } else [exit]
    puts "C"
}
# Call it and see, _no_ early exit
commentDemonstration
它们是真正的注释。只是你必须平衡(或反斜杠引用)过程定义中的大括号(除非你疯狂到用双引号或其他什么来定义过程主体;为了你自己的理智,不要这样做)与你使用的注释无关。大多数时候你都没有注意到平衡要求,但这是一个重要的例子



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

如果注释行为发生变化,那么这行代码会发生什么:
proc foo{}{#什么都不做}
?您认为右大括号应该是注释的一部分吗(因此需要在下一行使用右大括号),或者您认为它应该结束proc定义吗?如果允许内联注释,我希望第一个选项发生。如果注释行为发生变化,您希望这一行会发生什么:
proc foo{}{do nothing}
?您认为右括号应该是注释的一部分吗(因此在下一行需要一个右括号),或者你认为它应该结束proc定义吗?如果允许内联注释,我希望出现第一个选项。根据这个答案,我引用的是Tclers wiki页面上的注释,特别是“行中没有字符被解释,除了…”正确吗?@DurgaDatta:是的,你引用的文本是正确的。注意这里有两种不同的解释“通过”。第一种解释是对
proc
命令的调用进行解释。在这个“通过”过程中,
#
没有特殊意义:它只是文本。解释是
proc
test
{}
{…{…}
(第三个参数中的文本部分在此处压缩为省略号)并发现大括号不平衡。在解释过程正文中的第一行时,
#
变得重要,并阻止对以下字符的解释,但此时不平衡已经存在。@DurgaDatta:注意,我在这里使用的术语“pass”非常简单:还有第二个“pass”仅因为调用命令时,
proc
的第三个参数的内容作为脚本进行计算。因此,Tcl解释严格来说是一次性的。根据这个答案,是我从Tclers wiki页面引用的注释,特别是“行中没有字符被解释,除了…”正确吗?@DurgaDatta:是的,你引用的文本是正确的。注意这里有两种不同的解释“通过”。第一种解释是对
proc
命令的调用进行解释。在这个“通过”过程中,
#
没有特殊意义:它只是文本。解释是
proc
test
{}
{…{…}
(第三个参数中的文本部分在此处压缩为省略号),并发现大括号不平衡。在解释过程正文中的第一行时,
#
变得重要,并阻止解释以下字符