在书中进行回声服务示例,在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
}
}
我没有逃脱也尝试过,但仍然是一样的。有什么想法吗?
答案 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)手册页中有详细解释,但您必须仔细阅读以收集详细信息。