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

  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 описано как именно что копировать. Я туда пока из примеров и тестов только всякую мелочь засунул, хочу сначала удостоверится что это всё не зря. Вас всё устраивает в том как я сделал?

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

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

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

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

тем, что оно не покрывает весь функционал file of. Но как отдельная быстрая реализация блочных файлов записей (без множеств, массивов и прочего) имеет право на существование

  1. Приведите мне хоть 1 программу где множества записываются в file of T. У меня это не работает
  2. Он легко может покрыть весь тот же функционал, но для этого надо или сделать value-типовые строки и массивы встроенными, или добавить шаблоны - не_типы. В таком случае получится типовый файл который действительно покрывает все задуманные возможности. А ваш - тоже покрывает не все. Я уже сколько раз вам сказал - есть проблемы вроде не сохранения приватных поле. И их вашими костылями не решить. Зато в моём способе всё нормально на этом фронте.

Да чего там решать. Просто в Type.GetFields передать флаг, чтобы приватные поля добавлялись.

нет, массивы и строки в .NET ссылочные и пусть остаются такими. и потом, в .NET все уже украдено до нас:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct StringInfoA {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2;
}

Проверьте в своей библиотеке, как там запись в памяти располагается.

1 лайк