// 2026 Богданович Давид Когут Прихожденко
взяти визначення мавка;
простір мавка {
структура АргументПрочитаного {
М: *Машина;
повідомлення: *Притриманий;
відклик: *Притриманий;
}
внутрішня дія обробник_прочитання(
сирий_текст: кд,
кінець_файлу: логічне,
аргумент: адреса,
) {
змінна ап = аргумент як *АргументПрочитаного;
змінна М = ап.М;
змінна предмет_відклика = ап.відклик.предмет;
якщо ап.повідомлення != пусто {
відпустити_притриманий_глобально(М, ап.повідомлення);
}
відпустити_притриманий_глобально(М, ап.відклик);
звільнити(М, ап);
змінна інформація_падіння: ІнформаціяПадіння;
змінна кількість_задіяних = п32(0);
змінна дані_задіяних: *Значення = пусто;
якщо не кінець_файлу {
кількість_задіяних = п32(1);
дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));
дані_задіяних[0] = ПРЕДМЕТ(створити_текст_без_копіювання(
М,
сирий_текст.розмір,
сирий_текст.дані,
));
}
здійснити(
М,
НЕДІЙСНЕ,
ПРЕДМЕТ(предмет_відклика),
Задіяні { ВидЗадіяних2, кількість_задіяних, дані_задіяних, 0 },
Місцезнаходження { М.створити_текст("вм://машина/предмети/аввід/дії/запитати.ц"), 0 },
);
якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
якщо М.налаштування.обробник_падінь == пусто {
ЗАПАНІКУВАТИ(М, "необроблене падіння!");
} інакше {
вимкнути_стан_падіння(М);
М.налаштування.обробник_падінь(
М,
інформація_падіння
);
}
}
}
внутрішня дія рідна_дія__запитати(
М: *Машина,
діяльність: *Діяльність
) -> ЗначенняАбоСтанПадіння {
змінна задіяне_повідомлення = НЕДІЙСНЕ;
змінна знайдено_задіяне_повідомлення = ні;
змінна задіяне_відклик = НЕДІЙСНЕ;
змінна знайдено_задіяне_відклик = ні;
знайдено_задіяне_повідомлення = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._повідомлення, задіяне_повідомлення::адреса);
знайдено_задіяне_відклик = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._відклик, задіяне_відклик::адреса);
змінна успіх = ні;
змінна позиція_помилки = природне(0);
змінна предмет_повідомлення: *ПредметТексту = пусто;
якщо знайдено_задіяне_повідомлення {
якщо задіяне_повідомлення.вид != ЗПредмет {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"повідомлення\" має бути текстом."));
}
предмет_повідомлення = задіяне_повідомлення.дані як *Предмет як *ПредметТексту;
якщо предмет_повідомлення.клас != М.клас_Текст {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"повідомлення\" має бути текстом."));
}
}
якщо задіяне_відклик.вид != ЗПредмет {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"відклик\" має бути дією."));
}
змінна предмет_відклика = задіяне_відклик.дані як *Предмет;
якщо предмет_відклика.клас != М.клас_Дія {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"відклик\" має бути дією."));
}
змінна ап = мавка::виділити<АргументПрочитаного>(М, 1);
ап.М = М;
якщо предмет_повідомлення == пусто {
ап.повідомлення = пусто;
} інакше {
ап.повідомлення = притримати_глобально(М, предмет_повідомлення як *Предмет);
}
ап.відклик = притримати_глобально(М, предмет_відклика);
читати_ввід_асинхронно(
М,
предмет_повідомлення,
обробник_прочитання,
ап,
ні,
);
вернути НЕДІЙСНЕ;
}
дія записати_дію__аввід__запитати(
М: *Машина,
предмет_модуля: *ПредметМодуля
) {
змінна кількість_параметрів = природне(2);
змінна дані_параметрів = виділити<Значення>(М, кількість_параметрів);
дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
М,
М.константи_назв._повідомлення,
пусто,
НЕДІЙСНЕ
));
дані_параметрів[1] = ПРЕДМЕТ(створити_параметр(
М,
М.константи_назв._відклик,
пусто,
НЕДІЙСНЕ
));
змінна д = створити_рідну_дію(
М,
М.константи_назв._запитати,
створити_послідовність_без_копіювання(
М,
кількість_параметрів,
дані_параметрів
),
пусто,
рідна_дія__запитати,
пусто
);
записати_властивість_модуля(
М,
предмет_модуля,
М.константи_назв._запитати,
ПРЕДМЕТ(д)
);
}
}