Вы, безусловно, можете сделать это «путем Лиспа».
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, достаточно эффективен и поддерживает базы данных в памяти, если вы не хотите копаться с дисковыми файлами.