TCL因子计算代码:close-brace之后的额外字符

时间:2015-10-23 16:11:13

标签: cygwin tcl

这是TCL中的代码,用于生成由用户作为参数给出的数字的阶乘。

if {$argc !=1}{
    puts stderr "Error! ns called with wrong number of arguments! ($argc)"
    exit 1
} else 
    set f [lindex $argv 0]



proc Factorial {x}{
for {set result 1} {$x>1}{set x [expr $x - 1]}{
    set result [expr $result * $x]
}
return $result
}
set res [Factorial $f]
puts "Factorial of $f is $res"

有一个类似的SO question,但似乎没有直接解决我的问题。我已经仔细检查了代码中的语法错误,但它没有通过tclsh在Cygwin中成功编译产生错误:

$ tclsh ext1-1.tcl
extra characters after close-brace
    while executing
"if {$argc !=1}{
        puts stderr "Error! ns called with wrong number of arguments! ($argc)"
        exit 1
} else
        set f [lindex $argv 0]



proc Factorial {x}{..."
    (file "ext1-1.tcl" line 3)

TCL代码:NS Simulator for Beginners,Sophia-Antipolis,2003-2004

1 个答案:

答案 0 :(得分:4)

对于空白而言,Tcl比大多数语言更敏感(尽管不像Python那么多)。例如,除了作为命令分隔符的命令之外,您不能添加未转义的换行符。另一组规则是:1)每个命令必须以与正确列表相同的方式编写(其中元素由空格分隔)和2)命令调用必须具有命令定义指定的参数数量。

由于调用必须看起来像一个正确的列表,如

之类的代码
... {$x>1}{incr x -1} ...

无法工作:以开放式大括号开头的列表元素必须以匹配的大括号结束,并且紧跟在大括号之后的任何文本都不能与初始大括号匹配。 (这听起来比实际上复杂得多。)

参数数量要求意味着

for {set result 1} {$x>1}{incr x -1}{
    set result [expr $result * $x]
}

因为for命令需要四个参数(开始测试下一个正文)并且它只获得两个 start 和其他三个人的混搭(实际上甚至没有,因为混搭是非法的)。

要使这项工作成功,需要将参数分开:

for {set result 1} {$x>1} {incr x -1} {
    set result [expr {$result * $x}]
}

放入空格(或标签,如果需要)使参数合法且正确。