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