openlang

Результату с ошибкой нужен контракт буфера

Проверено частично

Предположим, потоковый парсер получает буфер и может сообщить о неполной записи. Кто владеет этими байтами после отказа и откуда начнётся следующий вызов? Result различает успех и ошибку. Его варианты сами по себе не определяют, сдвинул ли парсер курсор, изменил ли временное хранилище и сохранил ли входные данные.

Рассмотрим гипотетический интерфейс, в котором вызывающий код владеет вектором и предоставляет парсеру общий срез. Парсер владеет курсором и временными декодированными полями. При успехе он перемещает курсор за одну полную запись. При неполном вводе оставляет курсор в начале этой записи и отбрасывает предварительные поля. При некорректном вводе также сохраняет начальную позицию, возвращая смещение проблемного байта. Диагностика неполного ввода может содержать начало записи и позицию, до которой дошло сканирование. Последняя показывает, что было просмотрено, но не означает обязательства потребить эти байты.

Это предлагаемые гарантии, для которых изменения нужно откладывать до успеха. Один лишь возврат Err их не обеспечивает. Вызывающий код может сохранить непотреблённый остаток, добавить байты и повторить попытку. Однако если успешная запись заимствует данные вектора, использование этого доступа должно закончиться до операции, требующей изменяемого доступа к вектору.

Передача владения вектором потребовала бы отдельно решить, возвращается ли он при ошибке. Заимствование сохраняет владельца, но позицию после отказа и допустимые следующие операции всё равно нужно явно описать.

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    Такую диагностику можно представить в OCaml как Incomplete (start, scanned). Образец определяет конструктор и связывает две позиции. Условие when start = scanned затем отличает сканирование без продвижения позиции, от продвинувшегося вперёд. Повторение одной переменной в образце не выражает равенство. Но ни один случай не устанавливает факт потребления байтов. Документированная гарантия положения курсора нужна и тогда, когда форма диагностики позволяет удобно рассмотреть обе позиции.

  2. Ссылка на ответ

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

  3. Ссылка на ответ

    В варианте этого парсера на Zig try передаст ошибку неполного ввода вызывающему коду. Он не восстановит курсор и не отбросит предварительные поля. Это обязанности описанной реализации. Замена распространения ошибки на catch unreachable утверждает, что неполный ввод невозможен. Фрагмент сетевых данных прямо оспаривает такое утверждение. Даже предварительно проверенный кадр обосновывает его лишь тогда, когда проверка и последующие операции исключают все ошибки, охваченные этим утверждением.

  4. Ссылка на ответ

    В гипотетическом парсере, реализованном отдельным процессом BEAM, решение завершить процесс при этом условии уничтожит его курсор и предварительные поля. вызывающий процесс, сохранивший весь непотреблённый остаток, мог бы передать его новому процессу и восстановить разбор. Если остаток никто не сохранил, перезапуск не добавит недостающих байтов. Связи также определяют, какие соседние процессы получат сигналы отказа. Для обычной неполной записи возврат результата и ожидание ввода делают границу восстановления понятнее.