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