После ещё некоторого успешного тестирования и оптимизаций, уверенно считаю, что работать с разговорником стало легче, а принципы его работы - более просты. Продолжаем разбор новых функций.
Упрощённая структура блоков
Напомню, что каждая фраза в разговорнике состоит из блоков, каждый из которых является машиной конечных состояний. Эти блоки изменяют глобальный контекст и реагируют на его изменения. Этот контекст является общим для фраз на всех отображаемых языках. Раньше у каждого блока было поле требований, которые, если не удовлетворены, полностью скрывали блок. Ещё у каждого состояния в блоке был свой набор условий, каждое из которых могло вдобавок быть пассивным. Эта система работала, но мне всё не давала покоя её ненужная сложность, и я сильно желал её упростить.
Теперь же функции требований для отключения блока объединены с условиями состояний. Каждый тег в условии состояния может быть в одном из 3х состояний: игнорирован, запрошен, либо предоставлен. Запрошенный тег, если отсутствует в контексте, скрывает данное состояние. Предоставляемый тег, при показе состояния, посылается в глобальный контекст. При изменении соответствующих свойств контекста каждый блок составляет рейтинг из своих состояний на основе их предоставляемых тегов, и показывает первое из них, либо никакое, если ни одно состояние не нашло все запрашиваемые теги. Абстрактно это может звучать несколько сложно, но на примере должно стать понятно.
Простая фраза с двумя блоками: "ду вянда (я иду)" . Первый блок - я - может быть в одном из двух состояний: "ду (ед.)" и "нисса (мн.)". Первое состояние предоставляет в контекст информацию о том, что лицо в единственном числе, а второе - что во множественном. Далее, второй блок - иду - может быть в одном из трёх состояний: "вянда (муж.)", "рянда (жен.)", "дянда (мн.)". Первое состояние, прежде всего, требует, чтобы человек в контексте был в единственном числе, и предоставляет информацию о том, что он - мужчина. Второе состояние выдвигает то же требование, и предоставляет то, что человек - женщина. А третье состояние не предоставляет ничего, лишь требуя, чтобы лицо было во множественном числе, так как эта информация уже предоставлена во втором состоянии первого блока. Изменение отображаемого состояния в любом блоке с предоставляемыми тегами посылает цепную реакцию через контекст во все другие блоки во всех языках. Вот как-то так.
Post #61
242