среда, 25 декабря 2019 г.

Группы и глобальные правила

    Группа - совокупность типов данных имеющее схожее поведение. Пример из стандартного модуля:


group UnsignedInteger
//require
//add(a, a) -> a
//dec(:a)
//div(a, a) -> a
//equal(a, a) -> Bool
//fromString(a, [UInt8]) -> Box(a)
//greater(a, a) -> Bool
//greaterOrEqual(a, a) -> Bool
//inc(:a)
//less(a, a) -> Bool
//lessOrEqual(a, a) -> Bool
//mod(a, a) -> a
//mul(a, a) -> a
//power(a, a) -> a
//sub(a, a) -> a
//toSigned(a) -> b
//toString(a) -> [UInt8]

    Как мы видим, при объявлении группы в начале идет ключевое слово group, затем имя создаваемой группы.  Имя группы должно соответствовать следующим правилам:
  • начинается с прописной буквы
  • содержит только буквы латинского алфавита, цифры и знак подчёркивания (_)
  • не может содержать два знака подчёркивания идущих подряд
    Хотя группа и объединяет типы со схожим поведением, невозможно проверить обладает ли тип нужным для группы поведением. Поэтому после объявления группы в комментариях я указываю функции которые необходимо реализовать для добавления типа в группу. Если функция используется конкретный тип, я его указываю как есть, если нужно указать тип который добавляется в группу, я использую псевдоним "a", если тип не известен то использую любую другую букву латинского алфавита.
    Для добавления типа в группу, существуют глобальные правила. Эти правила аналогичны тем правилам которые используются в функциях, но вместо аргументов функций есть только один аргумент - type, который имеет значение любой тип. Также в глобальных правилах доступен оператор join который добавляет тип в группу. Синтаксис такой: join номер_правила имя_группы. В глобальных правилах нет правила final. Пример глобальных правил:


rules
    1 = type > UnsignedInteger //если какой либо тип входит в группу UnsignedInteger
    join 1 Integer //то добавить его в группу Integer
    join 1 UnsignedNumber //и в группу UnsignedNumber

Комментариев нет:

Отправить комментарий

Пожалуйста без мата и оскорблений. Если хотите сообщить об ошибках, для этого есть форма обратной связи.