// 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 }
      );

      вернути ПРЕДМЕТ(предмет_РезультатВиконання);
    }

    дія записати_дію__система__виконати(
      М: адреса<Машина>,
      предмет_модуля: адреса<ПредметМодуля>
    ) {
      // потім: створити параметри

      змінна д = створити_рідну_дію(
        М,
        створити_текст(М, "виконати"),
        М.предмет_пустої_послідовності,
        пусто,
        рідна_дія__виконати,
        пусто
      );

      записати_властивість_модуля(
        М,
        предмет_модуля,
        М.константи_назв._виконати,
        ПРЕДМЕТ(д)
      );
    }
  }
}