// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка/машина;

простір мавка {
  внутрішня дія записати_параметри_структури_Модуль(М: адреса<Машина>) {
    змінна кількість_параметрів = природне(1);
    змінна дані_параметрів = виділити<Значення>(М, кількість_параметрів);

    дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
      М,
      М.константи_назв._назва,
      пусто,
      пусто
    ));

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

  дія заповнити_клас_Модуль(
    М: адреса<Машина>
  ) {
    М.клас_Модуль.вбудований = так;
    М.клас_Модуль.заборонити_наслідування = так;

    записати_параметри_структури_Модуль(М);
  }

  дія створити_модуль(
    М: адреса<Машина>,
    назва: адреса<ПредметТексту>
  ) -> адреса<ПредметМодуля> {
    змінна предмет = виділити_предмет<ПредметМодуля>(М, М.клас_Модуль);

    предмет.готовий = ні;
    предмет.назва = назва;
    предмет.властивості = Призначення { 0, пусто, 0 };

    вернути предмет;
  }

  внутрішня дія записати_властивості_модуля_з_іменованого(
    М: адреса<Машина>,
    позиція: природне,
    назва: адреса<ПредметТексту>,
    значення: Значення,
    аргумент: невідома_адреса
  ) {
    якщо перевірити_чи_предмети_тексту_рівні(М, назва, М.константи_назв._назва) {
      вернути;
    }

    записати_властивість_модуля(
      М,
      аргумент як адреса<ПредметМодуля>,
      назва,
      значення
    );
  }

  дія здійснити_клас_модуля(
    М: адреса<Машина>,
    задіяні: Задіяні,
    місцезнаходження: Місцезнаходження
  ) -> ЗначенняАбоСтанПадіння {
    змінна задіяне_назва = НЕДІЙСНЕ;

    знайти_задіяне(М, задіяні, 0, М.константи_назв._назва, задіяне_назва::адреса);

    змінна назва: адреса<ПредметТексту> = пусто;

    якщо задіяне_назва.вид == ЗНедійсне {
    } інакше якщо задіяне_назва.вид == ЗДійсне або задіяне_назва.вид == ЗЧисло {
      вернути МІСЦЕПАДІННЯ(М, створити_текст(М, "Назва модуля має бути текстом."), місцезнаходження);
    } інакше {
      назва = задіяне_назва.дані як адреса<Предмет> як адреса<ПредметТексту>;

      якщо назва.клас != М.клас_Текст {
        вернути МІСЦЕПАДІННЯ(М, створити_текст(М, "Назва модуля має бути текстом."), місцезнаходження);
      }
    }

    змінна предмет_модуля = створити_модуль(М, назва);

    перебрати_іменовані_задіяні(
      М,
      задіяні,
      записати_властивості_модуля_з_іменованого,
      предмет_модуля
    );

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

  дія записати_властивість_модуля(
    М: адреса<Машина>,
    предмет_модуля: адреса<ПредметМодуля>,
    назва: адреса<ПредметТексту>,
    значення: Значення
  ) {
    призначити(
      М,
      предмет_модуля.властивості::адреса,
      назва,
      значення
    );
  }

  дія предмет_модуля_отримати_властивість(
    М: адреса<Машина>,
    предмет_модуля: адреса<ПредметМодуля>,
    назва: адреса<ПредметТексту>,
    місцезнаходження: Місцезнаходження
  ) -> ЗначенняАбоСтанПадіння {
    якщо перевірити_чи_предмети_тексту_рівні(М, назва, М.константи_назв._назва) {
      якщо предмет_модуля.назва != пусто {
        вернути ПРЕДМЕТ(предмет_модуля.назва);
      }
      вернути НЕДІЙСНЕ;
    }

    змінна значення_властивості = НЕДІЙСНЕ;

    якщо знайти_призначене(
      М,
      предмет_модуля.властивості,
      назва,
      значення_властивості::адреса
    ) {
      вернути значення_властивості;
    }

    змінна предмет_методу = знайти_метод_в_класі(
      М,
      М.клас_Модуль,
      назва
    );

    якщо предмет_методу == пусто {
      вернути НЕДІЙСНЕ;
    }

    вернути ПРЕДМЕТ(предмет_методу);
  }
}