LINUX.ORG.RU

История изменений

Исправление LeninGad, (текущая версия) :

переменная типа dict имеет (тащит за собой) параллельное представление в виде списка

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

Hash entries для dict собираются в двусвязный список, но этот «список» ничего общего не имеет со встроенным типом «список» (tclListType). Последний неудобен для вставок и удалений, он сильно тормозил бы при таком использовании.

У Tcl_Obj может быть максимум два представления: строковое и некое «внутреннее». В каждый момент времени у объекта присутствует хотя бы одно, иногда оба. Значение не может одновременно иметь tclListType и tclDictType в качестве внутреннего представления. Тот двусвязный список, который используется для упорядочивания ключей — часть внутреннего представления tclDictType.

Кстати, это означает, что вот так делать не надо никогда:

foreach {key value} $mydict { ... }

По смыслу dict for {key value} $mydict {...} не отличается ничем, но foreach преобразует значение dict'а в список (как минимум это лишнее копирование, но в неудачном случае можно потерять цепочку hash entries, и она будет заново создаваться при использовании $mydict как словаря.

Исходная версия LeninGad, :

переменная типа dict имеет (тащит за собой) параллельное представление в виде списка

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

Hash entries для dict собираются в двусвязный список, но этот «список» ничего общего не имеет со встроенным типом «список» (tclListType). Последний неудобен для вставок и удалений, он сильно тормозил бы при таком использовании.

У Tcl_Obj может быть максимум два представления: строковое и некое «внутреннее». В каждый момент времени у объекта присутствует хотя бы одно, иногда оба. Значение не может одновременно иметь tclListType и tclDictType в качестве внутреннего представления. Тот двусвязный список, который используется для упорядочивания ключей — часть внутреннеге представления tclDictType.

Кстати, это означает, что вот так делать не надо никогда:

foreach {key value} $mydict { ... }

По смыслу dict for {key value} $mydict {...} не отличается ничем, но foreach преобразует значение dict'а в список (как минимум это лишнее копирование, но в неудачном случае можно потерять цепочку hash entries, и она будет заново создаваться при использовании $mydict как словаря.