Tcl 尝试为生成缺少参数的循环创建嵌套错误

Tcl 尝试为生成缺少参数的循环创建嵌套错误,tcl,Tcl,我试图教自己使用Tcl编程。(我想更加熟悉这门语言以理解其他人的代码——SCID国际象棋) 我给自己设定的激励我学习Tcl的任务是解决8皇后问题。 我创建程序的方法是成功地“原型化”解决方案。 所以 我要嵌套一个for循环,保存第2行的q位置 在for循环内,保持第1行上的q位置 这是我的密码 set allowd 1 set notallowd 0 for {set r1p 1} {$r1p <= 8} {incr r1p } { puts "1st row q placed

我试图教自己使用Tcl编程。(我想更加熟悉这门语言以理解其他人的代码——SCID国际象棋) 我给自己设定的激励我学习Tcl的任务是解决8皇后问题。 我创建程序的方法是成功地“原型化”解决方案。 所以 我要嵌套一个for循环,保存第2行的q位置 在for循环内,保持第1行上的q位置

这是我的密码

set allowd 1
set notallowd 0

for {set r1p 1} {$r1p <= 8} {incr r1p } {
    puts "1st row q placed at $r1p" 
    ;# re-initialize r2 'free for q placemnt' array after every change of r1 q pos:
    for {set i 1 } {$i <= 8} {incr i} { set r2($i) $allowd    }

    for { set r2($r1p) $notallowd ; set r2([eval $r1p-1]) $notallowd ;
           set r2([eval $r1p+1]) $notallowd ; set r2p 1}   {$r2p <= 8} {
         incr r2p ;# end of 'next' arg of r2 forloop
        }
        ;# commnd arg of r2 forloop placed below: 
        {puts "2nd row q placed at $r2p"    
    }
} 
set allowd 1
设置notallowd 0

对于{set r1p 1}{$r1p来说,在最后一个for循环中的命令之前的回车符就是您得到的。从中可以看出,“分号和换行符都是命令分隔符,除非下面引用。”顺便说一句,您的eval应该是expr

这对我很有用:

set allowd 1
set notallowd 0

for {set r1p 1} {$r1p <= 8} {incr r1p } {
    puts "1st row q placed at $r1p" 
    ;# re-initialize r2 'free for q placemnt' array after every change of r1 q pos:
    for {set i 1 } {$i <= 8} {incr i} { set r2($i) $allowd    }

    for { set r2($r1p) $notallowd ; set r2([expr $r1p-1]) $notallowd ;
        set r2([expr $r1p+1]) $notallowd ; set r2p 1}   {$r2p <= 8} {
        incr r2p ;# end of 'next' arg of r2 forloop
    } {
        # commnd arg of r2 forloop placed below: 
        puts "2nd row q placed at $r2p"    
    }
} 
set allowd 1
设置notallowd 0

对于{set r1p 1}{$r1p来说,在最后一个for循环中的命令之前的回车符就是您得到的。从中可以看出,“分号和换行符都是命令分隔符,除非下面引用。”顺便说一句,您的eval应该是expr

这对我很有用:

set allowd 1
set notallowd 0

for {set r1p 1} {$r1p <= 8} {incr r1p } {
    puts "1st row q placed at $r1p" 
    ;# re-initialize r2 'free for q placemnt' array after every change of r1 q pos:
    for {set i 1 } {$i <= 8} {incr i} { set r2($i) $allowd    }

    for { set r2($r1p) $notallowd ; set r2([expr $r1p-1]) $notallowd ;
        set r2([expr $r1p+1]) $notallowd ; set r2p 1}   {$r2p <= 8} {
        incr r2p ;# end of 'next' arg of r2 forloop
    } {
        # commnd arg of r2 forloop placed below: 
        puts "2nd row q placed at $r2p"    
    }
} 
set allowd 1
设置notallowd 0

对于{set r1p 1}{$r1p非常感谢!这会不会成为我的备忘录,让我不再犯同样类型的错误:如果一个函数的空间用完了,参数仍然需要键入,那么下一个参数的大括号必须放在行的末尾,以发出警告(也就是说)对于“后面还有更多内容”的解释器来说,不是解释器改变了它解析命令的方式,而是arg的主体恰好包含了一个换行符。顺便说一句,您还可以通过在行的末尾添加“\”来继续一个命令。确切地说,是Tcl解释器(当然还有字节码编译器)总是以完全相同的方式解析所有内容。真的。没有任何特殊的语法没有列在Tcl语言手册的主页面上。非常感谢!这是否可以作为一个备忘录,让我不再犯同样类型的错误:如果一个函数的空间用完了,参数仍然需要键入,那么打开一个brac对于下一个参数,e必须放在行的末尾,以警告(也就是说)解释器“后面还有更多”?不是解释器改变了它解析命令的方式,而是arg的主体恰好包含一个换行符。顺便说一句,您还可以通过添加“\”来继续命令确切地说,Tcl解释器(当然还有字节码编译器)总是以完全相同的方式解析所有内容。真的。没有任何特殊的语法没有在Tcl语言手册主页上列出。