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