Как получить список массивов в tcl

Я провел некоторое исследование, но нашел только уродливые хаки, которые используют уникальное имя для каждого элемента массива и сохранить имена в список. Есть ли способ сделать это правильно?


person Terry Shi    schedule 24.01.2011    source источник


Ответы (2)


Вместо массивов вы хотите использовать словари: http://www.tcl.tk/man/tcl8.5/TclCmd/dict.htm

Словари являются переменными первого класса и могут передаваться (и помещаться в список) так же, как и другие переменные.

% set d1 [dict create a b c d]
% set d2 [dict create e f g h i j]
% set lst [list $d1 $d2]
% set lst  ;# ==> {a b c d} {e f g h i j}
person glenn jackman    schedule 25.01.2011
comment
Кроме того, array get возвращает словарь в версии 8.5. - person Donal Fellows; 25.01.2011

На работе мы до сих пор используем Tcl 8.4. Я знаю, что dict был портирован обратно, но он не является частью стандартных пакетов. Для версии 8.4 мы используем список ключей из пакета Tclx. вот пример:

# Problem: I want to create a list of arrays
# Solution: For 8.5, I can have list of dict, but for 8.4, use 
# keyedlist in place of dict. This script is written for 8.4

package require Tclx

# Create individual users and a list
keylset user1 id 101 alias john; # {{id 101} {alias john}}
keylset user2 id 102 alias ally; # {{id 102} {alias ally}}
set users [list $user1 $user2]

# Show the list
foreach user $users {
    puts "ID:    [keylget user id]"
    puts "Alias: [keylget user alias]"
    puts ""
}

Выход:

ID:    101
Alias: john

ID:    102
Alias: ally
person Hai Vu    schedule 25.01.2011