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

时间:2019-07-16 15:58:17

标签: 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版本问题吗?这与通过模拟器运行有关系吗?我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

  

这是Tcl版本问题吗?

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