2015-10-23 43 views
0

这是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模拟器对于初学者来说,索菲亚 - 安提波利斯,2003-2004

+2

它应该是'proc Factorial {x} {'。只需在两者之间添加一个空格。 – Dinesh

+1

与条件相同的东西:应该是'if {$ argc!= 1} {'。这是导致错误的原因。代码中出现同样的问题。将所有参数分开是至关重要的。 –

回答

3

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

由于调用必须看起来像一个适当的列表,类似的代码

... {$x>1}{incr x -1} ... 

将无法​​正常工作:以开放的括弧列表元素必须以匹配的右括号结束,不能有请紧随与最初打开大括号相匹配的大括号之后的任何文本。 (这听起来比它更复杂的,真的。)

数的论点的要求意味着

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

将无法​​工作,因为for命令需要四个参数(开始测试下身子 ),它只有两个,开始和其他三个其他混搭(实际上甚至没有,因为混搭是非法的)混搭。

为了使这项工作,参数需要分开:

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

请辞空格(或制表符,如果你想)让争论的法律和正确的数量。