Tcl и записи (структуры) - PullRequest
       12

Tcl и записи (структуры)

0 голосов
/ 02 апреля 2011

Пакет struct :: record из TCLLIB предоставляет средства для эмуляции типов записей.Но экземпляры записей - это команды в текущем пространстве имен, а не переменные в текущей области.Это означает, что для экземпляров записей сборка мусора отсутствует.Передача имени экземпляра записи в процедуру означает передачу его по ссылке, а не по значению, можно передать строковое представление записи в качестве параметра, но для этого требуется создать другой экземпляр в процедуре, настроить его и удалить вручную, это раздражает,Я задаюсь вопросом об обосновании этого дизайна.Простая альтернатива - предоставить записи в стиле lisp - набор процедур построения, доступа и изменения и представлять записи в виде списков.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Реализация struct :: record, с моей точки зрения, является реализацией в стиле oo.Если вы ищете реализацию в стиле данных (например, lisp), где команды полностью отделены от данных, вы можете посмотреть на команду dict .

Я будуобратите внимание, что oo-style и data-style на самом деле не являются хорошими описаниями, но они были лучшими, что я мог придумать не по себе.

1 голос
/ 04 апреля 2011

Вы, безусловно, можете сделать это «путем Лиспа».

 proc mkFooBarRecord {foo bar} {
     # Keep index #0 for a "type" for easier debugging
     return [list "fooBarRecord" $foo $bar]
 }
 proc getFoo {fooBarRecord} {
     if {[lindex $fooBarRecord 0] ne "fooBarRecord"} {error "not fooBarRecord"}
     return [lindex $fooBarRecord 1]
 }
 # Etc.

Это работает довольно хорошо.(Напишите это на C, и вы тоже можете сделать это более эффективным.) Помните, что как общая структура данных, многие люди предпочитают словари Tcl 8.5.Есть много способов их использовать;вот один из них:

 proc mkFooBarRecord {foo bar} {
     return [dict create "type" fooBarRecord "foo" $foo "bar" $bar]
 }
 proc getFoo {fooBarRecord} {
     dict with fooBarRecord {
         if {$type ne "fooBarRecord"} {error "not fooBarRecord"}
         return $foo
     }
 }

Что касается дебатов о целых структурах и объектах, Tcl склонен рассматривать объекты как состояния с операциями (приводя к естественному представлению в виде команды, довольно тяжелого понятия), тогда как структуры являются чистыми значениями.(и так легкий).Написав об этом, я действительно не знаю, что вообще лучше;Я работаю на индивидуальной основе.Если вы работаете со «структурами», также подумайте, должны ли у вас быть коллекции, представляющие поля во многих структурах (эквивалентно использованию хранения по столбцам вместо хранения по строкам в базе данных), поскольку это может привести к более эффективной обработке в некоторыхслучаи.

Также рассмотрите возможность использования базы данных;SQLite очень хорошо интегрируется с Tcl, достаточно эффективен и поддерживает базы данных в памяти, если вы не хотите копаться с дисковыми файлами.

0 голосов
/ 02 апреля 2011

Я не буду отвечать на ваш вопрос, потому что я не использовал Tcl в течение многих лет, и я никогда не использую такую ​​структуру, но я могу дать вам путь к двум возможным местам, которые очень правдоподобны, чтобы дать хороший ответ дляyou:

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

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