我已经开发了一些代码,我在Linux机器上遇到了错误标记Tcl解释器的问题.
#!/usr/bin/tclsh
if {1} {
puts "abc1"
} elseif {} {
puts "abc2"
}
Run Code Online (Sandbox Code Playgroud)
上述代码在"elseif"进入条件之前不会标记条件
错误elseif.有没有办法检查这种无意中完成的拼写错误.
Tcl在编译时没有发现错误,在上面的示例中,它可以确定它永远不需要首先检查elseif子句; 它只是puts直接发出.
现在,在存在非平凡的第一条件的情况下,elseif表达式中的错误直到达到它们才被报告.这就是如何if定义Tcl的语义 - 尤其是命令 - 的语义; 在执行命令时报告评估中的错误(与总主语法相反).我可以理解你对此的沮丧,并建议你查看Tcler的静态语法分析工具的Wiki页面,它可以为你标记潜在的问题(在非常适度的假设下,实际上总是如此).特别是,我听说过Frink和TDK中的检查工具(后者是商业工具,但质量非常高).
为了详细说明 Donal 的答案,Tcl 在编译时不会发现错误,因为在一般情况下这是无法完成的,在 if 之前执行的任何代码都可能重新定义了 if 命令,因此它可能是有效的,这是确定这是否有效的唯一方法是这样的情况是运行代码(即这是停机问题)
考虑这个脚本:
gets stdin input
if {$input == "fail"} {
rename if if_
proc if {arg1 arg2 arg3} {
puts "ha ha"
}
}
if {1} { puts "success"}
Run Code Online (Sandbox Code Playgroud)
显然,在不运行程序的情况下,不可能静态确定 if {1} 行是否具有正确数量的参数
TCL 实际上没有语法,编译器无法检查任何内容,您能做的最好的就是 Lint 样式警告,这仅在某些情况下才准确