我目前正在为 NS2 编写一个 Tcl 脚本,其中的内容通过 Tcl 中的命令添加到列表中lset x 0 end+1 $item
。请参阅下面的测试脚本:
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} {}
完美运行!问题是这是使用 Tcl 8.6 通过运行命令编写的tclsh test.tcl
。我尝试运行的实际代码是使用 NS2 和 Tcl 版本 8.5 运行的。Tcl 8.5 不支持该lset end
功能。如何更新 Ns2 以在 Tcl 8.6 上运行?我的电脑上有 8.6;我只是不知道如何让 Ns2 使用它而不是 8.5。以这种方式使用lset
可以节省我相当多的时间和大量代码。
谢谢
答案1
这是一个解决方法:使用普通的 tcl 8.5 重新实现“end+1”功能
rename lset _tcl_lset
proc lpop {varname} {
upvar 1 $varname var
set value [lindex $var end]
set var [lrange $var 0 end-1]
return $value
}
proc lset {varname args} {
upvar 1 $varname var
set value [lpop args]
set indices $args
if {[lindex $indices end] eq "end+1"} {
lpop indices
set sublist [lindex $var {*}$indices]
lappend sublist $value
set args [list {*}$indices $sublist]
}
_tcl_lset var {*}$args
}