【问题标题】:Can someone tell me why the first block of TCL does not compile but second does?有人能告诉我为什么 TCL 的第一个块不能编译,而第二个可以吗?
【发布时间】:2015-10-30 17:09:30
【问题描述】:

代码如下。单独运行,上面的代码段没有编译,但下面的代码段编译正常。

proc printbobs  {times {textd "cream corn"}} {
    for {set r 0} {$r<$times} {incr r}{
        puts $textd
    }
    return $times
}
printbobs 2 
proc printText {times2 {textp "hello word"}} {
    for {set i 0} {$i<$times2} {incr i} {
        puts $textp
    }
    return $times2
}
printText 2

【问题讨论】:

    标签: tcl


    【解决方案1】:

    过程的第二行中{incr r}{ 之间缺少空格。

    【讨论】:

    • @mega_creamery,使其更易于理解,而 Tcl 中的那些花括号 suggest Tcl 使用类似于 C 编程语言的解析规则,但 Tcl 的规则不同。在 Tcl 中,匹配的大括号分隔“单词”——形成命令参数的文本块。在您的第一个代码块中——如果它编写正确——for 命令将接收 4 个参数:set r 0$r&lt;$timesincr r 和正文。在您的情况下,Tcl 未能解析第三个参数,因为它在 {incr r} 之后立即找到了 {,这是不允许的。
    • @mega_creamery,请阅读Tcl tutorial,尤其是那里的第5-7节。
    • @mega_creamery:另见here
    • 这是一个实验。结果:带有示例的 20 多行答案在 1.5 周内获得了 3 次赞成,而没有示例的单行答案在三天内获得了 6 次赞成。显然(并考虑到早期的经验),简短的答案比完整的答案更受欢迎。我不是在这里讽刺,我只是想了解如何提供最佳答案。实际上,这与十年前我教 C/C++ 时的情况完全不同。
    • 我对此的看法是,那些支持的人仍然觉得有必要真正理解答案。当然,要理解一个全面的答案(双关语),需要投入更多的时间或精力或两者兼而有之。顺便说一句,我有自己的most-idiotic-and-useless-and-still-the-most-upvoted 答案,基本上相当于为那些懒得做的人引用手册。好吧,就我而言,似乎该主题也经常被搜索:-)