Tcl [список abc] vs {abc} есть ли разница и в каком контексте? - PullRequest
3 голосов
/ 11 августа 2010

Я играю с Tcl и нашел несколько сценариев, где [list a b c] взаимозаменяем с {a b c}.Какой метод предпочтителен и где [list a b c] не соответствует поведению {a b c}?

Ответы [ 2 ]

7 голосов
/ 12 августа 2010
% set lista [list a b c]
a b c
% set listb {a b c}
a b c
% set b {1 2 3}
1 2 3
% set lista [list a $b c]
a {1 2 3} c
% set listb {a $b c}
a $b c

Когда вы строите список с использованием литералов, две формы эквивалентны.Когда вы используете переменные, форма [list ...] будет расширять переменную до помещения ее в строку, а форма {...} - нет.

По существу, {...} обрабатывает все, что находится внутри нее, как единыйнепрерывная строка;специальный символ $ никогда не интерпретируется.Оператор [list ...] берет свои аргументы и объединяет их вместе, разделенные пробелами.Следовательно, если элементы, с которыми вы работаете, являются строковыми литералами и не содержат ничего, что необходимо интерпретировать, то эти две формы совпадают.

5 голосов
/ 13 августа 2010

Для литералов они идентичны во всех функциональных отношениях (за исключением того, что прямая литеральная форма, конечно, немного быстрее).Что касается не-литералов, они, очевидно, делают разные вещи (как говорит bta).

Однако, это еще не все.Давайте погрузимся глубже!

Есть случаи, когда вы не хотите использовать формы {…} или "…", и это точно при работе с некоторыми не-литералами.В частности, если вы используете tcom или Tcl / Java (то есть Jacl или TclBlend), то вы будете работать с объектами, которые не подчиняются семантике Tcl должным образом.В частности, у вас будут «хрупкие» объекты, прикрепленные к некоторым значениям;если Tcl_Obj, содержащий ссылку на значение, изменил его тип («мерцание» на языке Tcl), тогда ссылка на базовый объект COM или Java будет безвозвратно удалена, и сборщик мусора удалит объект до того, как вы закончите.с этим.Использование формы [list …] для создания списков (и таких операций, как lindex для извлечения) обеспечит правильное ведение этих хрупких внутренних представлений до тех пор, пока они вам больше не понадобятся.

Для обычных значений Tcl, в том числеСозданный большинством пакетов расширений, вам не нужно беспокоиться об этом, кроме как отметить, что использование операций без потерь также быстрее.Если вы хотите, чтобы ваш код был быстрым (а кто нет?), То [list] ваш друг, даже если в этом нет необходимости (что часто бывает).

В другом случае вы хотите обратить вниманиеэто при создании обратных вызовов.

Часто вы хотите делать обратные вызовы, когда некоторые значения известны в момент создания обратного вызова, и не сохраняются в другой переменной, которая существует при выполнении обратного вызова.(Я часто делаю это с after, fileevent и trace, но есть лотов мест, где это делается.) Сценарии обратного вызова, созданные с помощью list (или некоторых другихгенерирующая списки команда) быстрее всех других альтернатив, потому что механизм оценки сценариев Tcl может доказать, что они не имеют подстановок, и перейти непосредственно к подаче элементов списка в диспетчер команд.Это довольно преимущество, когда вы просто передаете значения в процедуру, что считается хорошей практикой для обратных вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...