在这本书“Tcl和TK第4版的实用编程”中做回显服务示例,Brent B. Welch Ken Hobbs。
它在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
}
}我试过了,没有逃跑,但还是一样的。有什么想法吗?
发布于 2014-04-07 12:35:17
问题是这条线:
if {[eof $sock]} || [catch {gets $sock line}]} \
^^^这个额外的}提前终止了if,这使得行尾的}提前终止了过程的主体(您认为身体的其余部分显示为proc的额外参数,而proc不喜欢它)。
建议您避免使用反斜杠来引入类似的换行符;这只是额外的视觉噪音。我们还建议您使用一个编辑器,它可以进行自动缩进和/或括号匹配,这两者都可以帮助您立即发现问题。
发布于 2014-04-07 11:03:33
不要试图使你的Tcl代码看起来像C。它根本不是同一种语言。Tcl中的每个语句都由以换行符或分号结尾的单词组成。对单词进行分组的一种方法是使用大括号,但它们必须与短语的前一部分相同。您可以像正在尝试的那样对换行符进行转义,但这很脆弱,很难维护,因为如果在转义字符之后引入任何空格,则不再转义换行符,您将得到所看到的错误。
在Tcl代码中,将开头的大括号与代码放在同一行。例:
proc Echo {sock} {
if {1 == 0} {
puts "something"
} else {
puts "do something else"
expr {
1 * 2 +
3
}
}
}这在Tcl(1)手册页中有详细的解释,但是您必须仔细阅读它才能收集细节。
https://stackoverflow.com/questions/22908805
复制相似问题