lset in Tcl 使用过程和引用整数



我正在尝试使用 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} {}

完美工作!但是,当我转到我的大型项目时,尽管列表/子列表设置相同,但我不断得到"列表索引超出范围"。

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 版本问题吗?这与通过模拟器运行它有关吗?我在这里错过了什么?

这是 Tcl 版本问题吗?

是的,它是。Tcl 从 Tcl 8.6 开始学习通过[lset]扩展列表(参见 TIP 331),在 Tcl 8.5 中,您将获得list index out of range

最新更新