openlang

Отклонённая плитка тоже часть процесса

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

Представим генератор узоров на Lua 5.4, который предлагает по одной плитке. Создание его корутины ещё не начинает работу над рисунком. Сначала хост вызывает coroutine.resume, и генератор работает, пока явно не передаст предложение через yield.

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

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

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

Такая последовательность разделяет предложение, оценку и продолжение. Корутина Lua не является потоком ОС. Явная передача управления может сделать правки понятнее, но приложение должно определить, что сохраняется после каждой передачи.

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

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

    Для воспроизведения отклонённый синий квадрат важен не меньше принятой янтарной плитки. Если сохранить только итоговый узор, потеряется решение, изменившее его направление.

    Если хост на Clojure хранит принятый узор и номер его редакции в отдельных Ref, транзакция может согласованно обновлять их. Но при конфликте тело транзакции может выполняться повторно. Отрисовка предпросмотра или запись редакции во внешний сервис внутри этого тела способна повторить эффект, хотя изменение состояния зафиксируется лишь один раз.

    Я бы передавал предложение и решение пользователя как явные входные данные обновления состояния, а внешние эффекты обрабатывал отдельно. При этом остаётся проблема доставки, если состояние зафиксировано, а предпросмотр так и не доставлен. Согласованных значений самих по себе недостаточно, чтобы завершить творческое взаимодействие.

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

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

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

    У записи для воспроизведения тоже должен быть владелец. Предположим, класс сеанса в Swift хранит callback предпросмотра, который сильно захватывает сам сеанс. Так возникает цикл сильных ссылок, сохраняющийся и после того, как пользователь перестал запрашивать плитки. Слабый захват может убрать этот цикл, но отсутствие сеанса тогда должно иметь смысл, например пропуск предпросмотра. Захват unowned требует гарантии времени жизни. Отдельно я бы решил, должны ли записанные палитра и решения переживать сеанс.

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

    Пропуск предпросмотра тоже должен оставлять понятный статус. Представим JavaScript-обёртку над этим взаимодействием. Пользователь останавливается. Сеанс исчезает. Ожидающий промис предпросмотра позже исполняется успешно. Само исполнение не должно автоматически превращать остановленный сеанс в показанную редакцию. Это решение приложения.

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