mavka-ukr / mavka

Сучасна українська мова програмування
https://мавка.укр
Other
53 stars 4 forks source link

Переліки (enum) #10

Open kohutd opened 1 year ago

kohutd commented 1 year ago

Проблема

В мову згодом треба буде додати enum-и. Потрібно придумати для них синтаксис.

Пропозиція

Обговорити тут.

kohutd commented 1 year ago
вибірка РівеньДовіри
  НИЗЬКИЙ
  СЕРЕДНІЙ
  ВИСОКИЙ
кінець
вибірка РівеньДовіри число
  НИЗЬКИЙ = 0
  СЕРЕДНІЙ = 1
  ВИСОКИЙ = 2
кінець
вибірка РівеньДовіри текст
  НИЗЬКИЙ = "низ"
  СЕРЕДНІЙ = "сер"
  ВИСОКИЙ = "вис"
кінець
рд = РівеньДовіри.НИЗЬКИЙ

якщо рд рівно РівеньДовіри.ВИСОКИЙ
  друк("рд високий")
кінець

Щось таке, але в слові "вибірка" поки не впевнений.

DanikVitek commented 1 year ago

Думаю, "перелік" підійшло би

kohutd commented 1 year ago

@DanikVitek "перелік" звучить дійсно непогано :+1:

DanikVitek commented 10 months ago

Як щодо варіанту написання у вигляді переліку структур?

перелік Колір
  Жовтий
  Блакитний
  ЧЗС як
    червоний число
    зелений число
    синій число
  кінець
кінець

Або як перелік варіантів різних типів

перелік СинтаксичнеДерево
  Вираз як Вираз
  Констатування як Констатування
кінець

перелік Вираз
  ;; ...
кінець

перелік Констатування
  ;; ...
кінець
kohutd commented 10 months ago

@DanikVitek а які приклади застосування? Незрозуміло, що мається наувазі під як

DanikVitek commented 10 months ago

Прилади застосування:

кольори_прапору = [Колір.Жовтий, Колір.Блакитний]
жовтий_як_чзс = Колір.ЧЗС(червоний=255, зелений=255, синій=0)

сд = СинтаксичнеДерево.Вираз(Вираз(;-- ... --;))

Тобто як означає початок сигнатури варіанта-структури, або посилання на існуючий тип

DanikVitek commented 10 months ago

Приклад використання переліку для помилок

перелік ПомилкаРозборуЧисла є помилка
  РозбірЦілого як ПомилкаРозборуЦілого
  РозбірДоробового як ПомилкаРозборуДробового
кінець

структура ПомилкаРозборуЦілого є помилка
  введення текст
кінець

структура ПомилкаРозборуДробового є помилка
  введення текст
кінець
kohutd commented 10 months ago

Хм, цікаво. Проте чи не буде це робити путанину? Наприклад коли хочеться перевірити чи значення рівне кольору Рожевий з переліку Колір і логічно це робити так: знач == Колір.Рожевий, але в дійсності це структура типу:

перелік Колір
  Рожевий як
    ч число
    з число
    с число
  кінець
кінець
kohutd commented 10 months ago

Можливо Рожевий не найкращий приклад, проте якщо підставити той ж ЧЗС, то теж не дуже зрозуміло як це порівнювати

kohutd commented 10 months ago

Також, ще варіант з параметрами дії враховуючи приклад з ЧЗС:

дія щось_зробити_з_кольором(к Колір)
  ;; ...
кінець

Чи можливо передати ЧЗС в цей параметр, типу щось_зробити_з_кольором(Колір.ЧЗС(10, 20, 30)), чи має бути помилка

DanikVitek commented 10 months ago

За замовчуванням можна робити порівняння лише за співпадінням варіанта й значень полів, якщо варіант однаковий. У ідеалі - для перевірки значення варіанту варто мати pattern matching. Тоді було би щось аналогічне Rust, OCaml та подібним мовам:

enum Color {
  Yellow,
  Magenta,
  RGB {
    red: u8,
    green: u8,
    blue: u8
  },
}

impl PartialEq for Color {
  fn partial_eq(&self, other: &Self) -> bool {
    match (self, other) {
      (Color::Yellow, Color::Yellow)
      | (Color::Magenta, Color::Magenta)
      | (Color::Yellow, Color::RGB { red: 255, green: 255, blue: 0 })
      | (Color::RGB { red: 255, green: 255, blue: 0 }, Color::Yellow)
      | (Color::Magenta, Color::RGB { red: 255, green: 0, blue: 255 })
      | (Color::RGB { red: 255, green: 0, blue: 255 }, Color::Magenta) => true,

      (Color::RGB {red: r1, green: g1, blue: b1}, 
      Color::RGB {red: r2, green: g2, blue: b2}) => r1 == r2 && g1 == g2 && b1 == b2,
    }
  }
}
DanikVitek commented 10 months ago

Також, ще варіант з параметрами дії враховуючи приклад з ЧЗС:

дія щось_зробити_з_кольором(к Колір)
  ;; ...
кінець

Чи можливо передати ЧЗС в цей параметр, типу щось_зробити_з_кольором(Колір.ЧЗС(10, 20, 30)), чи має бути помилка

Так, має бути можливим передати Колір.ЧЗС у дію що приймає Колір, бо це один з його варіантів

DanikVitek commented 10 months ago

Думаю, варто додавати переліки такого виду лише разом із pattern matching, бо інакше буде дуже не зручно ними користуватися

kohutd commented 10 months ago

Також, ще варіант з параметрами дії враховуючи приклад з ЧЗС:

дія щось_зробити_з_кольором(к Колір)
  ;; ...
кінець

Чи можливо передати ЧЗС в цей параметр, типу щось_зробити_з_кольором(Колір.ЧЗС(10, 20, 30)), чи має бути помилка

Так, має бути можливим передати Колір.ЧЗС у дію що приймає Колір, бо це один з його варіантів

Виходить, що перелік Колір технічно буде структурою Колір, а Колір.ЧЗС буде структурою яка наслідуватиме структуру Колір

DanikVitek commented 10 months ago

Виходить, що перелік Колір технічно буде структурою Колір, а Колір.ЧЗС буде стуктурою яка наслідуватиме структуру Колір

Щось накшталт цього, так. Як один з варіантів реалізації, у випадку з JS

kohutd commented 10 months ago

Думаю, варто додавати переліки такого виду лише разом із pattern matching, бо інакше буде дуже не зручно ними користуватися

Тут +. Хоча прості переліки можна і вже робити

kohutd commented 10 months ago

Також варто писати слово структура після як, якщо вказується нова структура з властивостями:

перелік Колір
  Рожевий як структура
    ч число
    з число
    с число
  кінець
кінець

Якщо використовується наявна структура, то як і було:

перелік Колір
  Рожевий як РожевийКолір
кінець