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
我能够使流程中的所有内容正常工作,而且我知道 currentHeadID
是 puts
中的一个整数。列表索引如何超出范围?我试过调整 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
.
我正在尝试使用 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
我能够使流程中的所有内容正常工作,而且我知道 currentHeadID
是 puts
中的一个整数。列表索引如何超出范围?我试过调整 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
.