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解释器(或任何一般的解释器)被设计为将注释作为真实注释,我们会失去什么:一旦你看到#完全忽略直到新线(除了,检查评论的最后一个字符,如果是\)?
与许多其他语言不同,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中完全不同.