2013-07-30 4 views
4

Я хочу динамически добавлять элементы во вложенные списки. Рассмотрим следующий пример:Добавить элементы во вложенный список в TCL

set super_list {} 
lappend super_list {00 01 02} 
lappend super_list {10 11 12} 
lappend super_list {20 21} 

результаты в:

super_list = {00 01 02} {10 11 12} {20 21} 
[lindex $super_list 0] = {00 01 02} 
[lindex $super_list 1] = {10 11 12} 
[lindex $super_list 2] = {20 21} 

Как добавить еще одно значение (например, 22) в [LINDEX $ super_list 2]?

lappend [lindex $super_list 2] 22 

не работает!

Единственный способ решения проблемы я мог думать так далеко:

lset super_list 2 [concat [lindex $super_list 2] {22}] 

Является ли это действительно единственный путь?

Спасибо, Линуса

ответ

2

Там нет прямого метода списков, чтобы сделать это. Вы могли бы по крайней мере, завернуть его в процедурный:

proc sub_lappend {listname idx args} { 
    upvar 1 $listname l 
    set subl [lindex $l $idx] 
    lappend subl {*}$args 
    lset l $idx $subl 
} 
sub_lappend super_list 2 22 23 24 
{00 01 02} {10 11 12} {20 21 22 23 24} 

advatange этого подхода вы можете передать список индексов для работы в произвольно вложенных списков (например, lset):

% sub_lappend super_list {0 0} 00a 00b 00c 
{{00 00a 00b 00c} 01 02} {10 11 12} {20 21 22 23 24} 
+1

Существует прямой метод в 8.6; в 8.5 и 8.4 следует использовать описанный вами метод. До 8.4 ... это становится очень сложным ... _ –

3

в Tcl 8.6 (эта функция была добавлена, она не работает в более ранних версиях) вы можете использовать lset расширить вложенные списки с помощью индекса end+1:

set super_list {{00 01 02} {10 11 12} {20 21}} 
lset super_list 2 end+1 22 
puts [lindex $super_list 2] 
# ==> 20 21 22 

Вы можете обратиться к одному концу, используя также числовой индекс, но я думаю, что end+1 является более мнемоническим.

Смежные вопросы