tgoop.com/cpplastic/362
Last Update:
Про мову Ada я чув ду-у-у-уже давно і весь цей час мав враження, що вона давно померла й забута. Аж доки кілька років тому мій друг @repa4ok не розповів мені протилежне (дякую!). Мова розвивається (останній стандарт — 2022 року), спільнота розвивається, навіть менеджер пакетів є.
Мову колись створили для військових і назвали на честь першої програмістки у світі (так, першою була жінка, якщо хто не знав). Вирішив нарешті дати цій мові шанс і спробувати її для розвʼязання задач 14-го дня.
Синтаксис дуже схожий на Pascal (принаймні той, який памʼятаю я). Писати нею доволі важко, коли бачиш її вперше, бо є велике різноманіття конструкцій, а ментальної моделі для них в голові бракує. Попри це читається такий код вкрай легко — тут вам не C++ і, боже збав, не Rust.
Компілятор скаржиться на неправильне форматування, тож краще одразу налаштувати собі автоформат на збереження файлу. З цікавого: за стайл-гайдом відступи — 3 (три!) пробіли
procedure Solve_First is
package IO renames Ada.Text_IO;
begin
delclare
Counter : Integer := 0;
-- and so on...
Помилка:
Compile
[Ada] day_14.adb
day_14.adb:8:07: error: incorrect spelling of keyword "declare"
Але найголовніше, що мене до душі — це опис власних типів. Наприклад, в Ada не прийнято всюди використовувати «голий»
Integer
, і це правильно, бо він може значити що завгодно. Натомість ви «моделюєте» домен вашої задачі у вигляді типів, а компілятор вам допомагає їх дотримуватися (і лупить по руках, коли ви цього не робите). Ось шматочок мого коду:Width : constant := 101;
Height : constant := 103;
type X_Coordinate is mod Width;
type Y_Coordinate is mod Height;
type Matrix is array (X_Coordinate, Y_Coordinate) of Integer
with Default_Component_Value => 0;
type X_Movement is range -Width .. Width;
type Y_Movement is range -Height .. Height;
type Point is record
X : X_Coordinate;
Y : Y_Coordinate;
end record;
type Velocity is record
DX : X_Movement;
DY : Y_Movement;
end record;
type Robot is record
Pos : Point;
Vel : Velocity;
end record with Put_Image => Robot_Put_Image;
За умовами задачі треба було змоделювати переміщення роботів. Одна з цікавинок саме задач цього дня: коли робот доходить то стіни, то автоматично виходить з іншого боку, як часто роблять в іграх. І так зійшлося, що в Ada це можна описати!
type X_Coordinate is mod Width;
Ось це буквально значить, що координата X змінюється від 0 до 100 (
Width - 1
), а якщо раптом стає більше або менше, то врапається на нове коло. З іншого боку жодних автоматичних приведень типів немає, як і в Haskell, тож всі конвертації тільки ручками. До речі зараз вже бачу, що деякі типи можна було описати краще.Ще в мові є дженерики (трохи використав), є ООП (не бачив), є якісь засоби для формальної верифікації програм тощо. Дуже багато всього, але мені на жаль поки нема чого ще додати, бо я пів дня з нею всього посидів.
Точно повернуся до