在 NS2 中从 Tcl 8.5 升级到 8.6

在 NS2 中从 Tcl 8.5 升级到 8.6

我目前正在为 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
}

相关内容