Блочное сохранение в типизированный файл

Я продолжу настаивать на своём предложении. Сделайте модуль. Добавьте в класс Reset, Seek и всё что считаете нужным. Напишите справку. Включу модуль в инсталлят.

Да, вот только это не добавляет столько же производительности.

И это я тоже объяснил. Преимущества file of T состоят в Seek и скорости. Конвертация в массив байт тоже займёт время, когда это делается через указатели - это происходит на много быстрее.

Для начала, всё же, ответьте на мой вопрос - почему вы не хотите заменить свою реализацию моей? Назовите хоть 1 преимущество вашей реализации, что ли.

Сделал.Вторая ссылка в первом сообщение, попробуйте наконец всё же посмотреть на то что я вам кидал. Посмотрите как вам, проведите на своём компьютере тест скорости который я там собрал в файле test.pas. По крайней мере чтоб убедится что вас там всё устраивает. А может и чтоб увидеть что в вашей реализации нет преимуществ.

какие указатели? запись имеет например поле типа класс (множества) или статический массив, или строка. не будут тут указатели работать. выигрыш три копейки

  1. Множество имеет произвольную длину, как оно вообще может быть в типизированных файлах?
  2. Вот поэтому и надо сделать строку на value-типе. Посмотрите на тест производительности - это всё равно быстрее получается, хоть такая строка сама по себе не очень эффективна. И совсем не три копейки выйгрыш, а 5-6 раз.

Я смотрел, не волнуйтесь так. У меня разница в скорости - примерно в 8 раз. С полем set of integer := [2…5] - в полтора раза хуже наоборот.

Есть простой принцип. Не менять то, что уже работает.

Ваш способ не сохраняет приватные поля. Так что нет, он не работает. Точнее не всегда. Способ который закладывал Вирт - сохраняет приватные поля. Я это не кидаю в issue только потому что это невозможно исправить в вашем способе, никак.

Если так уж боитесь что будут баги у того что работало - зря, потому что я сразу сделаю все необходимые тесты, а не тогда когда эти баги появятся. И - в таком способе меньше проблем возникает. К примеру, те же статичные и константные поля правильно обрабатывает по умолчанию.

Или есть какая то другая причина? Процитирую, пожалуй, тут вас:

Правило ради правила ничего не стоит, в этом то вы со мной согласны? Так же, как и правило, которое именно в этой ситуации не работает.

Подождите, а как вы его вообще протестировали, с ним вообще должно не правильно сохранятся, set of T ведь ссылочный, нет?

set of byte и set of char в файл сохраняются (сериализуются в битовую строку), как в старом паскале. по-моему, этого достаточно.

А, понятно. Но это не объясняет - как @Admin сравнил это с моим способом))

Ну, я вашу логику насчёт этого не понимаю, но ладно.

Но если делать отдельным модулем - есть несколько проблем. К примеру, когда я делал короткие строки на value-типе - я расчитывал что их будет штопать компилятор паскаля, по шаблону что я дам. Дело в том, что у них бывает разная длина, не делать же 256 типов у которых будет отличаться только название и 1 значение (константа, объявленная в самом начале типа).

Как насчёт сделать что то такое:

type
  t1[l:integer]=class
  where l > 5;
  where l < 10;
    
    procedure p1 := writeln(l);
    
  end;

begin
  (new t1[7]).p1;
  (new t1[9]).p1;
  //var a := new t1[100];//Ошибка из за where
end.

Ожидается что развернётся в следующее:

type
  t1$7=class
    const l:integer = 7;
    
    procedure p1 := writeln(l);
    
  end;
  t1$9=class
    const l:integer = 9;
    
    procedure p1 := writeln(l);
    
  end;

begin
  (new t1$7).p1;
  (new t1$9).p1;
end.

Подобные вещи ведь уже есть, должно быть не сложно реализовать? То есть, вот, к примеру типы делегатов создаёт когда видит их упоминание в коде. Так же и тут.

Модуль BlockFileOfT я, конечно, соберу вскоре, но без своих BlockValueString, BlockValueArray и т.п. - он теряет половину своей полезности. Кстати, BlockValueArray уже не реализуешь, через кучу классов, просто потому, сколько значений может быть (9.22337203470729E+18).

Ну, добавить это поле в ваш код и посмотреть :))

А разве set of integer не ссылочный тип?

type
  r1=record
    s:set of word := [5..100];
  end;

begin
  writeln(sizeof(r1));
end.

У меня выводит 8, то есть поле s это ссылка. Это должно сохранять ссылку а не сам сет, что, хоть и не правильно, но должно быть только быстрее.
У меня если добавить поле типа set of byte в запись - ваш file of T выдаёт ошибку при компиляции, аля запись неправильная.

И всё же, как насчёт добвить шаблоны - не_типы, как показано выше? Это наверняка пригодится и вне блочных файлов. Но именно строки и массивы для блочных файлов - не знаю как по другому реализовать.

Нет, это какое-то катастрофическое усложнение языка в стиле C++. Вы даже не представляете, как грамматика замусоривается от обилия конструкций, что приводит потом к невозможности расширять язык в другом месте. Уж не говоря о том, что там надо очень тщательно продумывать семантику.

Тогда что вы предлагаете, как реализовать короткие строки, которые можно будет сохранить в блочный файл?

Предлагаю сконцентрироваться на более полезных вопросах :slight_smile:

А вы продолжаете называть блочное сохранение бесполезным, хотя оно может быть полезно. Чем оно вам так не угодило?

Полезно, но точно не базовая фича языка. В типизированные файлы так просто мне страшно влазить - вот, я вижу в контексте среди других данных стек стеков типизированных файлов на случай сохранения контекста. Сломать - проще лёгкого. А контексты используются в лямбдах.

@Admin вот.

Я сделал в виде репозитория, чтоб я мог менять со временем. Вам нужно лишь сделать чтоб файлы из этого репозитория копировались в ваш, во время сборки или тестирования компилятора. В Readme.md описано как именно что копировать. Я туда пока из примеров и тестов только всякую мелочь засунул, хочу сначала удостоверится что это всё не зря. Вас всё устраивает в том как я сделал?

чего чего? стек стеков? Можете подробнее объяснить?

Только не в лямбды! УМОЛЯЮ !!! Запаримся потом баги ловить. При мне раз было что-то - треть языка улетела на сутки с лишним.

Ага. Сделаю в ближайшее время.

Есть у кого идеи что в примеры добавить? Можете файлом скринуть, я посмотрю и скорее всего добавлю.