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