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