从Tcl Book运行Echo Service示例时出现编译错误

时间:2014-04-07 09:44:30

标签: tcl tk

在书中进行回声服务示例,在Tcl&amp ;;中进行实用编程。 TK第4版'布伦特B.韦尔奇肯琼斯杰弗里霍布斯。

它在第241页,例17-3。将它直接从书中复制出来并给出了以下错误:

tclsh "theEchoService.tcl" (in directory: /home/<username>/Documents/Scripts/tcl)
Compilation failed.
wrong # args: should be "proc name args body"
    while executing
"proc Echo {sock} \
{
    global echo
    if {[eof $sock]} || [catch {gets $sock line}]} \
    {
        ;# end of file or abnormal connection drop
        close $sock
        pu..."
    (file "theEchoService.tcl" line 16)

继承我的完整代码:

#!/usr/bin/tclsh
;#The Echo Service. Socket ProgrammingPage 241, Example 17-3
proc Echo_Server {port} \
{
    global echo
    set echo(main) [socket -server EchoAccept $port]
}
proc EchoAccept {sock addr port} \
{
    global echo
    puts "Accept $sock from $addr $port"
    set echo(addr, $sock) [list $addr $port]
    fconfigure $sock -buffering line
    fileevent $sock readable [list Echo $sock]
}
proc Echo {sock} \
{
    global echo
    if {[eof $sock]} || [catch {gets $sock line}]} \
    {
        ;# end of file or abnormal connection drop
        close $sock
        puts "Close $echo(addr, $sock)"
        unset echo(addr,$sock)
    } \
    else \
    {
        if {[string compare $line "quit"] == 0} \
        {
            ;# Prevent new connections, Existing connections stay open
            close $echo(main)
        }
        puts $sock $line
    }
}

我没有逃脱也尝试过,但仍然是一样的。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

问题在于这一行:

if {[eof $sock]} || [catch {gets $sock line}]} \
              ^^^

额外的}提前终止了if,这使得该行末尾的}提前终止了该过程的主体(以及的其余部分)你认为身体是proc的额外参数,它不喜欢它。

你建议避免使用反斜杠来引入这样的换行符;它只是额外的视觉噪音。您还推荐使用可以进行自动缩进和/或括号匹配的编辑器,这两者都可以帮助您立即找到问题。

答案 1 :(得分:1)

不要试图使你的Tcl代码看起来像C.它根本不是同一种语言。 Tcl中的每个语句都由以换行符或分号结尾的单词组成。对单词进行分组的一种方法是使用花括号,但这些方法必须与短语的前一部分位于同一行。你可以逃避换行,因为它看起来像你试图做的但是这很脆弱且难以维护,因为如果你在转义字符之后引入任何空格,你就不再逃脱换行符而你得到你看到的错误。

在Tcl代码中,将开口括号放在与代码相同的行上。例如:

proc Echo {sock} {
    if {1 == 0} {
        puts "something"
    } else {
        puts "do something else"
        expr {
           1 * 2 +
             3
        }
    }
}

这在Tcl(1)手册页中有详细解释,但您必须仔细阅读以收集详细信息。