lset 在 Tcl 中使用过程和参考整数

lset in Tcl using procedure and reference integer

我正在尝试使用 Tcl 向子列表添加值。通过互联网,我发现最有效的方法是这样使用 lset

lset x 0 end+1 $item

但是,我在更大更复杂的范围内遇到了 lset 的问题。 lset 是一个过程的内部,它从外部获取一个引用变量来引用列表中的正确位置。我创建了简单的测试脚本以查看它是否有效:

set x { {} {} {} }
set refID 1
proc addValue {value} {
    global x refID
    set value [expr $value*2]
    lset x $refID end+1 $value 
} 
addValue 7
addValue 8
# => {} {14 16} {}

完美运行!但是,当我进行较大的项目时,尽管 list/sublist 的设置相同,但我一直得到 'list index out of range'。

set allNodes { {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} }
# Many lines of proc stuff
...
puts "Testing $currentHead $currentHeadID --- $n2 $nd2"
            if {$d<40 && $currentHeadID!=$nd2} {
                lappend members $nd2
                lset allNodes $currentHeadID end+1 $n2
               }
...
# continuing

我能够使流程中的所有内容正常工作,而且我知道 currentHeadIDputs 中的一个整数。列表索引如何超出范围?我试过调整 end 和其他一些东西,但似乎无法弄清楚。

即使我在代码中添加了一个简单的手动测试:

set allNodes { {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} }

lset allNodes 0 end+1 5
# => list index out of range while executing
# "lset allNodes 0 end+1 5"

我仍然遇到列表索引问题,即使它的构建方式与我的简单过程完全相同。这是 Tcl 版本问题吗?这与通过模拟器运行有关吗?我在这里错过了什么?

Is this a Tcl version issue?

是的,是的。从 Tcl 8.6 开始,Tcl 学会了通过 [lset] 扩展列表(参见 TIP 331),在 Tcl 8.5 中你将得到 list index out of range.