открыть: Синтаксис 2Syntax 1

Перечисления

Пока не реализовано в интерпретаторе.

Перечисление (enumeration) - это такой тип данных, где целому числу сопоставляется текстовая строка. Определение перечисления похоже на определение класса, но дополнительно указывается ключевое слово `enum, следующее за именем определяемого типа. Далее можно указать начальное значение (целое число). Если оно не указано, то будет использован ноль. В теле перечисления располагается список констант (без явных присвоений значений). Каждой константе автоматически сопоставляется своё число по порядку, начиная с начального значения, и с увеличением на 1. А также сопоставляется текстовая строка, равная имени константы. При выводе значения перечисления через функцию #echo используется сопоставленный текст.

$день_недели `enum 1 ~ понедельник# вторник# среда# четверг# пятница# суббота# воскресенье# ; `plain day = $день_недели.понедельник# day #echo # -- выдаст: понедельник

Конвертирование и ключи мапы

Значения перечислений свободно конвертируются в типы $int, $text и обратно с помощью функции #as. При конвертировании целого числа, выходящего за рамки в тип перечисления, используется ближайшее пограничное значение. При конвертировании текста, который не сопоставлен ни одной константе перечисления, используется первое значение.

2 #as $день_недели #echo # -- выдаст: вторник n# #echo # -- перевод строки 'среда' #as $день_недели #as $int #echo # -- выдаст: 3 n# #echo # 0 #as $день_недели #echo # -- выдаст: понедельник n# #echo # 100 #as $день_недели #echo # -- выдаст: воскресенье n# #echo # 'привет' #as $день_недели #echo # -- выдаст: понедельник

Перечисление может быть использовано в качестве ключа для мапы (тип $map).

$week_day `enum 1 ~ monday# tuesday# wednesday# thursday# friday# saturday# sunday# ; `plain lang_ru = { $week_day.monday# : 'понедельник' $week_day.tuesday# : 'вторник' $week_day.wednesday# : 'среда' $week_day.thursday# : 'четверг' $week_day.friday# : 'пятница' $week_day.saturday# : 'суббота' $week_day.sunday# : 'воскресенье' } day = $week_day.sunday# lang_ru[day] #echo # -- выдаст: воскресенье

При преобразовании типа перечисления в массив, получается массив его значений, следующих по порядку. Зная это и используя native функцию #map_combine, которая создаёт мапу из массива ключей и массива значений, предыдущий пример можно переписать следующим образом.

$week_day `enum 1 ~ monday# tuesday# wednesday# thursday# friday# saturday# sunday# ; `plain $week_day #as $array #map_combine [ 'понедельник' 'вторник' 'среда' 'четверг' 'пятница' 'суббота' 'воскресенье' ] => lang_ru day = $week_day.sunday# lang_ru[day] #echo # -- выдаст: воскресенье

Значение одного перечисления можно преобразовать в значение другого перечисления напрямую. При этом будет использован порядковый номер элемента (а не сопоставленное целое число).

$hero `enum ~ Lion#, Lina# ; $герой `enum ~ Лион#, Лина# ; `plain player = $hero.Lina# ru_name = player #as $герой ru_name #echo # -- выдаст: Лина

Статические свойства

Как и класс, перечисление может содержать статические свойства. Они указываются после элементов-констант.

$some_number `enum ~ zero# one# two# `static min = $.zero# max = $.two# ; `plain $some_number.min #echo # -- выдаст: zero