首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Tcl运行Echo服务示例时的编译错误

从Tcl运行Echo服务示例时的编译错误
EN

Stack Overflow用户
提问于 2014-04-07 09:44:29
回答 2查看 90关注 0票数 0

在这本书“Tcl和TK第4版的实用编程”中做回显服务示例,Brent B. Welch Ken Hobbs。

它在241页,例17-3。把它直接从书上抄下来,给了我以下的错误:

代码语言:javascript
复制
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)

提供了我的完整代码:

代码语言:javascript
复制
#!/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
    }
}

我试过了,没有逃跑,但还是一样的。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-07 12:35:17

问题是这条线:

代码语言:javascript
复制
if {[eof $sock]} || [catch {gets $sock line}]} \
              ^^^

这个额外的}提前终止了if,这使得行尾的}提前终止了过程的主体(您认为身体的其余部分显示为proc的额外参数,而proc不喜欢它)。

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

票数 2
EN

Stack Overflow用户

发布于 2014-04-07 11:03:33

不要试图使你的Tcl代码看起来像C。它根本不是同一种语言。Tcl中的每个语句都由以换行符或分号结尾的单词组成。对单词进行分组的一种方法是使用大括号,但它们必须与短语的前一部分相同。您可以像正在尝试的那样对换行符进行转义,但这很脆弱,很难维护,因为如果在转义字符之后引入任何空格,则不再转义换行符,您将得到所看到的错误。

在Tcl代码中,将开头的大括号与代码放在同一行。例:

代码语言:javascript
复制
proc Echo {sock} {
    if {1 == 0} {
        puts "something"
    } else {
        puts "do something else"
        expr {
           1 * 2 +
             3
        }
    }
}

这在Tcl(1)手册页中有详细的解释,但是您必须仔细阅读它才能收集细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22908805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档