这是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
答案 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}]
}
放入空格(或标签,如果需要)使参数合法且正确。