在 TCL 中动态创建嵌套列表

Dynamically Create Nested Lists in TCL

在 NS2 中使用 Tcl,我试图根据项目总数创建嵌套列表。例如,我有 20 个项目,因此我需要在 allLists {} 列表中创建 20 个列表,稍后我可以使用 puts "[lindex $allLists 0 2]" 之类的东西添加某些值。下面是我的代码:

for {set i 0} {$i < $val(nn)} {incr i} {
    set allClusters {
        set nodeCluster [lindex $allClusters $i] {}
    }
}
puts "$allClusters" 
puts "Node Cluster 0: [lindex $nodeCluster 0]"

我的预期输出是 20 个空白列表和 1 个额外的 nodeCluster 0:

{}
{}
{}
...
Node Cluster 0: {}

相反,我将其作为引用项获取:

set nodeCluster [lindex $allClusters $i] {}

第一,我不想手动设置嵌套列表,因为稍后我会在 $allLists 中有 100 多个列表。第二,如果没有值附加到它,我最终不想创建嵌套列表。

如何为变化的值创建嵌套列表?

我没有完全理解这个问题,但据我了解,您需要创建一个列表列表,其中较大的列表包含 20 个较小的列表。你也许可以使用这样的东西:

set allClusters [list]
set subClusters [list]
for {set i 0} {$i < 20} {incr i} {
    lappend subClusters [list]
}
lappend allClusters $subClusters

puts $allClusters
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}

$allClusters 是一个包含 20 个较小列表的列表。

如果你想在索引 2 处为较小的列表设置一个值,你必须先提取较小的列表,然后 lappend 到它,然后再放回去:

set subCluster [lindex $allClusters 0 2]
lappend subCluster "test"
lset allClusters 0 2 $subCluster

您可以创建一个 proc 来执行上述操作:

proc deepLappend {clusterName indices value} {
    upvar $clusterName cluster
    set subCluster [lindex $cluster {*}$indices]
    lappend subCluster $value
    lset cluster {*}$indices $subCluster
}

deepLappend allClusters {0 2} "test"
deepLappend allClusters {0 2} "test"

puts $allClusters
# {{} {} {test test} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}

虽然如果您正在创建一组空列表,您可以尝试使用 lrepeat:

set allClusters [list [lrepeat 20 [list]]]
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}