Cygwin TCL阶乘计算代码:右大括号后的额外字符

Cygwin TCL阶乘计算代码:右大括号后的额外字符,cygwin,tcl,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 re

这是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"
有一个类似的例子,但它似乎没有直接解决我的问题。我仔细检查了代码的语法错误,但它没有通过
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初学者,Sophia Antipolis,2003-2004

TCL比大多数语言(尽管不如Python)对空格更敏感。例如,除了作为命令分隔符的命令之间,不能添加未缩放的换行符。另一组规则是:1)每个命令必须以与适当列表相同的方式编写(其中元素由空格分隔);2)命令调用必须具有命令定义指定的参数数量

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

... {$x>1}{incr x -1} ...
不起作用:以大括号开头的列表元素必须以匹配的右大括号结尾,并且右大括号后面不能有与初始大括号匹配的文本。(这听起来比实际情况更复杂。)

参数数量要求意味着

for {set result 1} {$x>1}{incr x -1}{
    set result [expr $result * $x]
}
不会工作,因为
for
命令需要四个参数(开始测试下一个body),而它只得到两个,开始和其他三个参数的mashup(实际上甚至没有,因为mashup是非法的)

要实现这一点,需要将参数分开:

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

添加空格(或制表符,如果您愿意)可以使参数合法且在数量上正确。

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

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

... {$x>1}{incr x -1} ...
不起作用:以大括号开头的列表元素必须以匹配的右大括号结尾,并且右大括号后面不能有与初始大括号匹配的文本。(这听起来比实际情况更复杂。)

参数数量要求意味着

for {set result 1} {$x>1}{incr x -1}{
    set result [expr $result * $x]
}
不会工作,因为
for
命令需要四个参数(开始测试下一个body),而它只得到两个,开始和其他三个参数的mashup(实际上甚至没有,因为mashup是非法的)

要实现这一点,需要将参数分开:

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

放入空格(或制表符,如果您愿意)可以使参数合法且数量正确。

它应该是
proc Factorial{x}{
。只需在两者之间添加一个空格。与条件相同:如果{$argc!=1},则应该是
{
。这就是导致错误的原因。代码中到处都会出现相同的问题。分隔所有参数非常重要。它应该是
proc Factorial{x}{
。只需在两者之间添加一个空格。与条件相同:如果{$argc!=1},则应该是
{
。这就是导致错误的原因。代码中到处都会出现相同的问题。分隔所有参数非常重要。