Динамически создавать вложенные списки в TCL - PullRequest
0 голосов
/ 02 июля 2019

Используя Tcl внутри NS2, я пытаюсь создать вложенные списки на основе общего количества элементов. Например, у меня есть 20 элементов, поэтому мне нужно создать 20 списков в списке allLists {}, чтобы позже я мог добавить некоторые значения к чему-то вроде 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. Во-вторых, я не хочу создавать вложенный список, если к нему не будут добавлены значения.

Как мне создать вложенные списки для изменяющегося значения?

1 Ответ

3 голосов
/ 02 июля 2019

Я не полностью понял вопрос, но из того, что я понял, вам нужно создать список списков, с большим списком, содержащим 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]]]
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...