Эти значения, вероятно, начинаются как строки (это не полностью уверен, что это произойдет из-за возможности обмена буквами). Давайте посмотрим внимательно (если вы делаете это самостоятельно, команда tcl::unsupported::representation
находится только в 8.6, а никогда не изменяет объект, на который вы смотрите: я положил ;format x
на эту первую строку, чтобы убедиться, что мы не получаем никаких сюрпризов преобразования).
% set value [list "12" 14 2a "1a"];format x
x
% tcl::unsupported::representation [lindex $value 0]
value is a pure string with a refcount of 2, object pointer at 0x100874070, string representation "12"
% tcl::unsupported::representation [lindex $value 1]
value is a pure string with a refcount of 2, object pointer at 0x1008741c0, string representation "14"
% tcl::unsupported::representation [lindex $value 2]
value is a pure string with a refcount of 2, object pointer at 0x100874c40, string representation "2a"
% tcl::unsupported::representation [lindex $value 3]
value is a pure string with a refcount of 2, object pointer at 0x1008743d0, string representation "1a"
% tcl::unsupported::representation $value
value is a list with a refcount of 4, object pointer at 0x100874910, internal representation 0x1008eb050:0x0, string representation "12 14 2a 1a"
Так что да, эти значения практически одинаковы. Внутреннее представление какого-либо из них отсутствует, и каждое строковое представление использует буфер, который был выделен длиной 3 байта (по одному для каждого символа, а один для завершающего байта NUL). Однако сам список имеет строковое представление (а также его внутренний список), несмотря на то, что его не спрашивают; это потому, что вы используете список литералов, и компилятор Tcl оптимизирует это для одного литерала, так как обычно это правильно.
Надеюсь, что так, поскольку кавычки удаляются, прежде чем команда получит свои аргументы. –