В TCL все действительно строка? - PullRequest
0 голосов
/ 28 ноября 2018

А что это, если это не так?

Все, что я читал о TCL, гласит, что все это просто строка в нем.Внутри интерпретатора могут быть некоторые другие типы и структуры (для производительности), но на уровне языка TCL все должно вести себя как строка.Или я не прав?

Я использую IDE для программирования на ПЛИС под названием Vivado.Там активно используется автоматизация TCL.(Версия TCL все еще 8.5, если это помогает). Сценарии TCL в Vivado опираются на какую-то «объектно-ориентированную» систему.Веб-поиск не показывает никаких следов этой системы в другом месте.В этой системе объекты обычно получают из внутренней базы данных с помощью команд get_ *.Я могу манипулировать свойствами этих объектов с помощью команд типа get_property, set_property, report_property и т. Д. Но эти объекты кажутся чем-то большим, чем просто строка.Я попытаюсь проиллюстрировать:

> set vcu [get_bd_cells /vcu_0]
/vcu_0
> puts "|$vcu|"
|/vcu_0|
> report_property $vcu
Property                            Type    Read-only  Value
CLASS                               string  true       bd_cell
CONFIG.AXI_DEC_BASE0                string  false      0
<...>
> report_property "$vcu"
Property                            Type    Read-only  Value
CLASS                               string  true       bd_cell
CONFIG.AXI_DEC_BASE0                string  false      0
<...>

Но:

> report_property "/vcu_0"
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> report_property {/vcu_0}
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> report_property /vcu_0
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> puts |$vcu|
|/vcu_0|
> report_property [string range $vcu 0 end]
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.

Итак, мой вопрос: что это за «действительный объект Tcl первого класса»?

Пояснение: Этот вопрос может показаться, что вы просите помощи в сценариях Vivado, , но это не .(Я даже сомневался в добавлении [vivado] в теги.) Я могу просто жить и писать сценарии с этими мистическими объектами.Но было бы весьма полезно (для меня и, возможно, для других) лучше понять их внутреннюю работу.Является ли эта «объектная система» грязным хаком?Или это совершенно правильное использование TCL?Если это действительно так, где я могу прочитать об этом?Если это хак, как это (или может быть) реализовано?Где именно конец строки и начало объекта?

Связанный: Часть этого ответа можно рассматривать как мнение в пользу "хакерской" версии, но это довольно поверхностно всмысл моего вопроса.

1 Ответ

0 голосов
/ 28 ноября 2018

Значение Tcl первого класса - это последовательность символов, где эти символы взяты из базовой многоязычной плоскости спецификации Unicode.(Мы собираемся ослабить это ограничение BMP в будущей версии, но это еще не та версия, которую мы рекомендуем для использования.) Все остальные значения логически считаются подтипами этого.Например, двоичные строки имеют символы из диапазона [U + 000000, U + 0000FF], а целые числа представляют собой последовательности цифр ASCII, которым, возможно, предшествует небольшое количество префиксов (например, - для отрицательного числа).

С точки зрения реализации , происходит больше.Например, целые числа обычно реализуются с использованием 64-разрядных двоичных значений в порядке байтов, который используется в вашей системе (но при необходимости может быть расширен до bignums) внутри механизма упаковки значений, а строковая версия значения генерируется по требованию и кэшируется, покацелочисленное значение не изменяется.Числа с плавающей точкой - это числа с плавающей запятой IEEE.Списки внутренне реализованы как массив значений (с умом для обработки распределения).Словари - это хеш-таблицы со связанными списками, свисающими с каждого из хеш-блоков.И так далее. ЭТО ВСЕ ДЕТАЛИ РЕАЛИЗАЦИИ! Как программист, вы можете и обычно игнорировать их полностью.Вам нужно знать, что если два значения одинаковы, они будут иметь одинаковую строку, а если они имеют одинаковую строку, они будут одинаковыми в другой интерпретации.(Значения с разными строками также могут быть равны по другим причинам: например, 0xFF численно равен 255 - шестнадцатеричный или десятичный - но они не равны строковым значениям. Истинное естественное равенство Tcl - равенство строк.)

Истинные изменчивые сущности обычно представлены как именованные объекты: только имя является значением Tcl.Так работают все процедуры, классы, система ввода-вывода и т. Д. Tcl.Вы можете вызывать операции над ними, но вы можете видеть изнутри лишь в ограниченной степени.

...