# Примитивные типы данных

# Nil

Тип, сигнализирующий об отсутствии значения (аналог NULL в SQL). Имеет единственное значение - nil (и одноимённый литерал). Пример:

x = nil;       # x содержит значение типа Nil

Синонимы - нуль и null.

# Boolean

Логический тип данных, принимает два значения - true (истина) и false (ложь) (с одноимёнными литералами).

x = !true;     # x содержит значение Boolean(false)

# Real

Десятичное число в формате IEEE 754 размером 8 байт. Числовые литералы в тексте программы имеют именно этот тип, например:

x = 1;      # x содержит значение Real(1.0)
y = 1.25;   # y содержит значение Real(1.25)

# Конструктор

Значения типа Real можно создавать с помощью функции-конструктора real(x: Any): Real (синоним - число). Поддерживаются следующие типы аргумента:

  • Real

  • Int32

  • Int64 (если x не входит в диапазон значений, которые могут быть представлены с помощью Real, возникает исключение)

  • Money

  • Time

  • Boolean (false преобразуется в 0, true - в 1)

  • Nil (преобразуется в 0)

  • String (из строки удаляются пробельные символы слева и справа, затем полученная строка преобразуется в десятичное число. Если строка не является десятичным числом, то возникает исключение; пустая строка преобразуется в 0)

Если тип аргумента не входит в этот список, возникает исключение.

Примеры:

x = Real(false);        # 0
x = Real(00:01:20);     # 80
x = Real("  1.25  ");   # 1.25
x = Real("abc");        # исключение
x = Real("12.34a");     # исключение

# Money

Десятичное число в формате IEEE 754 размером 8 байт. Отличается от Real тем, что автоматически округляется до двух знаков после запятой. Не имеет собственного литерала.

x = Money(1.253);    # x содержит значение Money(1.25)

# Конструктор

Значения типа Money можно создавать с помощью функции-конструктора money(x: Any): Money (синоним

  • деньги). Функция аналогична конструктору real, но возвращает значение типа Money.

# Int32

Целое число размером 4 байта. Значения этого типа создаются с помощью литерала <целое число>_i32:

x = 42_i32;    # x содержит значение Int32(42)

# Конструктор

Значения типа Int32 можно создавать с помощью функции-конструктора int32(x: Any): Int32 (синоним

  • целоеЧисло32). Поддерживаются следующие типы аргумента:

    • Int32

    • Int64 (если значение не входит в диапазон Int32, то возникает исключение)

    • Real

    • Money

    • Time

    • Boolean (false преобразуется в 0_i32, true - в 1_i32)

    • Nil (преобразуется в 0_i32)

    • String (из строки удаляются пробельные символы слева и справа. Получившаяся строка преобразуется в целое число. Если строка не является целым числом или не входит в диапазон значений Int32, то возникает исключение; пустая строка преобразуется в 0_i32)

Если тип аргумента не входит в этот список, возникает исключение.

Примеры:

x = Int32(false);       # 0_i32
x = Int32(00:01:20);    # 80_i32
x = Int32("  42  ");    # 42_i32
x = Int32("abc");       # исключение
x = Int32("12.34");     # исключение

# Int64

Целое число размером 8 байт. Значения этого типа создаются с помощью литерала <целое число>_i64:

x = 42_i64;    # x содержит значение Int64(42)

# Конструктор

Значения типа Int64 можно создавать с помощью функции-конструктора int64(x: Any): Int64 (синоним

  • целоеЧисло64). Эта функция аналогична конструктору int32.

# String

Строка символов в кодировке UTF8. Имеются два вида строковых литералов:

  • однострочные в двойных кавычках: "<символы>"

  • многострочные в обратных кавычках: `<символы>`

Многострочные литералы могут включать в себя символ переноса строки. В строковых литералах допустимы следующие escape-последовательности:

  • \r

  • \n

  • \t

  • \\

  • \<десятичные-цифры>

  • \0<восьмеричные-цифры>

  • \0x<шестнадцатиричные-цифры>

Пример:

# однострочный литерал
"абв\nгде";

# многострочный литерал
`абв
где`;

# три байта со значением 128
"\128\0200\0x80"

# Конструктор

Значения типа String можно создавать с помощью функции-конструктора string(x: Any): String (синоним - строка). Поддерживаются следующие типы аргумента:

  • String

  • Int32

  • Int64

  • Real (по возможности форматируется без экспоненты)

  • Money (форматируется с двумя знаками после запятой)

  • Boolean ("true" или "false")

  • Nil ("")

  • Time (форматируется как литерал типа Time)

  • Date (форматируется как литерал типа Date, для null date все поля будут равны нулю)

  • DateTime (форматируется как пара литералов Date и Time, разделённые пробелом)

  • Bytes (последовательность байт рассматривается как строка в кодировке UTF-8; валидность строки не проверяется)

Если тип аргумента не входит в этот список, возникает исключение.

Примеры:

x = String(42_i32);              # "42"
x = String(42_i64);              # "42"
x = String(1.25);                # "1.25"
x = String(1);                   # "1"
x = String(Money(1));            # "1.00"
x = String(false);               # "false"
x = String(01:02:03);            # "01:02:03"
x = String(01.02.03);            # "01.02.03"
x = String(Bytes(97, 98, 99));   # "abc"

# Методы

# bytesSubstring(begin: Number, count: Number = 0): String (байтоваяПодстрока)

Возвращает подстроку, которая содержит count байт, начиная с байта с номером begin. Если аргумент count отсутствует, то подстрока будет содержать байты начиная от begin и до конца исходной строки. Поскольку строки хранятся в кодировке UTF8, этот метод может вернуть невалидную последовательность символов. Если begin или count выходят за пределы исходной строки, возникает исключение. Пример:

"abc".bytesSubstring(2, 1);      # "b"
"abc".bytesSubstring(2);         # "bc"
"абв".bytesSubstring(2, 2);      # невалидная UTF8-строка, содержит байты 0xB0 и 0xD0

# substring(begin: Number, count: Number = 0): String (подстрока)

Метод аналогичен bytesSubstring, но оперирует не отдельными байтами, а символами Unicode (которые могут состоять из одного или нескольких байт). Пример:

"абв".substring(2, 2);     # x = "бв"

# startsWith(prefix: String): Boolean (начинаетсяС)

Возвращает true, если строка начинается с заданного префикса prefix, и false в противном случае. Пример:

"abc".startsWith("ab");    # true
"abc".startsWith("de");    # false

# endsWith(suffix: String): Boolean (заканчиваетсяНа)

Возвращает true, если строка заканчивается заданным суффиксом suffix, и false в противном случае. Пример:

"abc".endsWith("bc");   # true
"abc".endsWith("de");   # false

# trimLeft(): String (обрезатьСлева)

Возвращает копию исходной строки, с начала которой удалены все пробельные символы (" ", "\n" и прочие). Пример:

"  abc".trimLeft();     # "abc"

# trimRight(): String (обрезатьСправа)

Возвращает копию исходной строки, с конца которой удалены все пробельные символы (" ", "\n" и прочие). Пример:

"abc  ".trimLeft();     # "abc"

# trim(): String (обрезать)

Эквивалентен последовательному вызову trimLeft и trimRight

"  abc  ".trim();                   # "abc"
"  abc  ".trimLeft().trimRight();   # "abc"

# caseCompare(other: String): Real (сравнитьБезРегистра)

Сравнивает строку со строкой other без учёта регистра символов в обеих строках. Возвращает

  • -1, если строка лексикографически меньше, чем other

  • 1, если строка лексикографически больше, чем `+other`

  • 0, если строки равны между собой

Пример:

"АБВ".caseCompare("абв");     # 0
"а".caseCompare("б");         # -1

# toUpper(): String (вВерхнийРегистр)

Возвращает копию строки, в которой все символы переведены в верхний регистр. Пример:

"аБв".toUpper();     # "АБВ"

# toLower(): String (вНижнийРегистр)

Возвращает копию строки, в которой все символы переведены в нижний регистр. Пример:

"аБв".toLower();     # "абв"

# findBytes(str: String, begin: Number = 1): Real (найтиБайты)

Метод ищет последовательность байтов str в исходной строке. Если такая последовательность содержится в строке, то метод возвращает индекс первого байта найденной последовательности, иначе возвращается 0. Поиск начинается с байта с индексом begin, а если этот аргумент отсутствует - то с начала строки. Если begin больше количества байтов в строке, возникает исключение. Пример:

"абв".findBytes("в");            # возвращает 5, поскольку символы а и б представляются двумя байтами
"абв".findBytes("г");            # возвращает 0
"абв абв".findBytes("абв", 7);   # возвращает 8

# find(str: String, begin: Number = 1): Real (найти)

Метод аналогичен findBytes, но оперирует Unicode-символами, а не отдельными байтами. Если он находит заданную последовательность символов в строке, то возвращает индекс первого символа этой подстроки, иначе возвращается 0. Пример:

"абв".find("в");      # возвращает 3

# replace(substring: String, replacement: String): String (заменить)

Возвращает копию исходной строки, в которой все вхождения подстроки substring заменены на replacement. Пример:

"абв 123 абв".replace("абв, "456");       # "456 123 456"

# split(separator: String): Array[String] (разбить)

Разбивает строку на подстроки, используя разделитель separator. Пример:

"абв::где::".split("::");     # @["абв", "где", ""]

# bytes(): Iterator (байты)

Возвращает побайтовый итератор для данной строки. Пример:

t = @[]
forall (b in "аб".bytes())
   t.pushBack(b)

# содержимое t: @[208, 176, 208, 177]

# chars(): Iterator (символы)

Возвращает посимвольный итератор для данной строки. Пример:

t = @[]
forall (b in "аб".chars())
   t.pushBack(b)

# содержимое t: @[1072, 1073]

# format(...): String (форматировать)

Форматирует строку, заменяя плейсхолдеры {} на значения аргументов. Синтаксис строки формата описан по ссылке (opens new window). Пример:

`{} + {} = {}`.format(1, 2, 1 + 2)                 # "1 + 2 = 3"
`[ {0:3d}) {0:5.2f} {1:>8} ]`.format(1, `text`)    # "[   1)  1.00     text ]"

# encode(encoding): Bytes (кодироватьВ)

Конвертирует строку из UTF-8 в кодировку encoding и возвращает результат конвертации в виде последовательности байтов. Если указана несуществующая кодировка, возникает исключение.

`абв`.encode(`cp866`)         # Bytes(0xA0, 0xA1, 0xA2)

# Свойства

# bytesCount: Real (количествоБайт)

Возвращает количество байт в данной строке. Пример:

"абв".bytesCount;       # 6

# charsCount: Real (количествоСимволов)

Возвращает количество Unicode-символов в данной строке. Пример:

"абв".charsCount;       # 3

# empty: Boolean (нетЭлементов)

Возвращает true, если строка пустая (bytesCount равно 0), и false в противном случае:

``.empty;      # true
`abc`.empty;   # false

# Time

Целое число, обозначающее количество секунд (положительное или отрицательное). Создаётся с помощью литерала <часы>:<минуты> или <часы>:<минуты>:<секунды>. Если количество часов больше 24, минут

  • больше 59, секунд - больше 59, то происходит ошибка компиляции. Примеры:
x = 01:02;     # один час и две минуты
y = 01:02:03;  # один час, две минуты и три секунды
z = 01:02:60;  # ошибка компиляции

# Конструктор

Значения типа Time можно создавать с помощью функции-конструктора time ( время ). Поддерживаются следующие перегрузки этой функции:

  • time(): Time - возвращает текущее время (количество секунд с начала текущего дня)

  • time(x: Any): Time - приводит значение x к типу Time. Если это невозможно, возникает исключение. Поддерживаются следующие типы аргумента:

    • Time

    • DateTime (отбрасывается дата)

    • Int32

    • Int64 (если значение не входит в диапазон Int32, возникает исключение)

    • Real (отбрасывается дробная часть)

    • Nil (преобразуется в 0)

    • String (пустая строка преобразуется в 00:00:00; если строка является датой-временем в формате ISO 8601, то возвращается время из этой строки; иначе из строки удаляются все пробельные символы в начале, конце, а также между числами и символами :, и если полученная строка является валидным литералом Time в формате <часы>:<минуты>:<секунды>, то возвращается его значение; иначе возникает исключение)

  • time(hours: Number, minutes: Number, seconds: Number): Time - создаёт значение типа Time по указанному значению часов, минут и секунд. Все аргументы должны быть неотрицательными числами, значение минут и секунд должно быть меньше 59, если эти условия не выполняются, то возникает исключение

Примеры:

x = Time(80);                 # 00:01:20
x = Time(` 01 : 02 : 03 `);   # 01:02:03
x = Time(1, 2, 3);            # 01:02:03
x = Time(`01:02`);            # исключение

# Свойства

# second: Real (секунда)

Возвращает количество секунд (= <значение> % 60). Пример:

x = 01:02:03;
x.second;      # 3

# minute: Real (минута)

Возвращает количество минут (= (<значение> % 3600) / 60). Пример:

x = 01:02:03;
x.minute;      # 2

# hour: Real (час)

Возвращает количество часов (= <значение> / 3600). Пример:

x = 01:02:03;
x.hour;        # 1

# Date

Целое число, количество дней, прошедшее с 01.01.1957 (положительное или отрицательное). Имеется специальное значение этого типа - null date, которое равно 16.04.1867. Тип Date имеет два литерала.

  • короткая форма - <день>:<месяц>:<год - 2 цифры>, например: 01.02.03

  • длинная форма - <день>:<месяц>:<год - 4 цифры>, например: 01.02.2003

В короткой форме значение года year интерпретируется следующим образом:

  • year < 462000 + year

  • year > 461900 + year

Таким образом, 01.01.30 == 01.01.2030, а 01.01.75 == 01.01.1975.

Если все поля литерала равны нулю, то создаётся значение null date:

00.00.00;      # null date
00.00.0000;    # null date

Если в литерале есть и нулевые, и ненулевые поля, а также если он не является допустимой датой, возникает ошибка компиляции:

00.01.02;      # ошибка компиляции
32.01.1990;    # ошибка компиляции

# Конструктор

Значения типа Date можно создавать с помощью функции-конструктора date ( дата ). Поддерживаются следующие перегрузки этой функции:

  • date(): Date - возвращает текущую дату

  • date(x: Any): Date - приводит значение x к типу Date. Если это невозможно, возникает исключение. Поддерживаются следующие типы аргумента:

    • Date

    • DateTime (отбрасывается время)

    • Nil (преобразуется в null date)

    • Int32

    • Int64 (если значение не входит в диапазон Int32, возникает исключение)

    • Real (отбрасывается дробная часть)

    • String (см. ниже)

  • date(format: String, value: String): Date - разбирает строку value в соответствии с форматом format (см. аналогичный конструктор DateTime)

  • date(day: Number, month: Number, year: Number): Date - создаёт значение типа Date по указанному значению дня, месяца и года. Все аргументы должны быть неотрицательными числами и формировать допустимую дату, если эти условия не выполняются, то возникает исключение

String преобразуется в Date по следующим правилам:

  • пустая строка преобразуется в null date

  • если строка является литералом Date в любом из форматов (причем допустимы пробелы в начале, конце строки, а также между числами и символами .), то возвращается значение этого литерала

  • если строка имеет формат YYYY-MM-DDThh:mm:ss.milZ (ISO 8601, пробелы недопустимы), то возвращается соответствующая дата

  • иначе возникает исключение

Примеры:

x = Date(0); # 01.01.1957
x = Date(` 01 . 02 . 03 `);      # 01.02.2003
x = Date(1, 2, 3);               # 01.02.2003
x = Date(1, 2, 2003);            # 01.02.2003
x = Date(`32.01.1990`);          # исключение

# Свойства

# day: Real (день)

Возвращает номер дня месяца. Пример:

x = 01.02.03;
x.day;         # 1

# month: Real (месяц)

Возвращает номер месяца в году. Пример:

x = 01.02.03;
x.month;       # 2

# year: Real (год)

Возвращает номер года. Пример:

x = 01:02:03;
x.year;        # 2003

# Методы

# format(fmt: String): String (форматировать)

Преобразует Date в DateTime и вызывает метод DateTime::format, т.е. этот метод аналогичен выражению

DateTime(self).format(fmt)

Пример:

Date(1, 2, 2000).format(`yyyy/MM/dd'T'HH:mm:ss`)      # "2000/02/01T00:00:00"

# DateTime

Объект, хранящий в себе дату и время определённого момента в прошлом или будущем (с точностью до миллисекунд). Не имеет собственного литерала. Имеется специальное значение null datetime, равное 16.04.1867 00:00:00.

Пример:

DateTime(`01.02.2000 03:04:05`);    # 1 февраля 2000 года, 3 часа, 4 минуты и 5 секунд

# Конструктор

Значения типа DateTime можно создавать с помощью функции-конструктора dateTime ( датаВремя ). Поддерживаются следующие перегрузки этой функции:

  • dateTime(): DateTime - возвращает текущую дату и время

  • dateTime(x: Any): DateTime - приводит значение x к типу DateTime. Если это невозможно, возникает исключение. Поддерживаются следующие типы аргумента:

    • DateTime

    • Nil (преобразуется в null date time)

    • Date (устанавливает указанную дату и время 00:00:00)

    • String (см. ниже)

  • dateTime(date: Any, time: Any): DateTime - создаёт значение DateTime по указанным дате и времени; date может иметь тип Date или DateTime (из нее берется только дата); time может иметь тип Time или DateTime (из нее берется только время); если любой из аргументов имеет неподходящий тип, возникает исключение

  • dateTime(format: String, value: String): DateTime - разбирает строку value в соответствии с форматом format, например: DateTime("dd.MM.yyyy 'at' HH:mm:ss", "01.02.2003 at 04:05:06"). Описание строки формата можно найти по ссылке (opens new window). Если строка формата невалидна, либо value не соответствует формату, возникает исключение

  • dateTime(day: Number, month: Number, year: Number, hour: Number = 0, minute: Number = 0, second: Number = 0, millisecond: Number = 0 ): DateTime

    • создаёт значение типа DateTime по указанному значению дня, месяца, года, часа, минуты, секунды и миллисекунды. Все аргументы должны быть неотрицательными числами и формировать допустимую дату и время, если эти условия не выполняются, то возникает исключение

При конвертации String в DateTime можно использовать следующие форматы строки:

  • <день>.<месяц>.<год> <час>:<минута>:<секунда>

  • <день>.<месяц>.<год>

  • YYYY-MM-DDThh:mm:ss.milZ (ISO 8601)

где год может иметь 2 или 4 цифры (2 цифры интерпретируются так же, как и в литералах даты). В первых двух форматах допустимы пробелы в начале, конце строки, а также между числами и символами-разделителями (. и :). В формате ISO 8601 пробелы недопустимы. Если строка соответствует первому формату, то возвращается DateTime для указанной даты и времени. Если строка соответствует второму формату, то возвращается DateTime для указанной даты с нулевым временем (00:00:00). Пустая строка преобразуется в null datetime. Если строка не соответствует ни одному формату, возникает исключение.

# Методы

Все методы DateTime выполняют "перенос" между полями, если в результате добавления значение поля выходит за допустимый диапазон. Например, при добавлении 60 секунд количество минут увеличится на 1, а значение секунд останется неизменными. Аналогично, при вычитании 24 месяцев год уменьшится на 2, а месяц останется неизменным. Добавлять можно как положительные, так и отрицательные величины.

# addMilliseconds(amount: Number): DateTime (добавитьМиллисекунды)

Возвращает копию исходного значения DateTime, к которой добавлено count миллисекунд. Пример:

x = DateTime(01.02.03, 04:05:06).addMillisecond(10);      # 01.02.03 04:05:06.010

# addSeconds(amount: Number): DateTime (добавитьСекунды)

Возвращает копию исходного значения DateTime, к которой добавлено count секунд. Пример:

x = DateTime(01.02.03, 04:05:06).addSeconds(10);           # 01.02.03 04:05:16.000

# addMinutes(amount: Number): DateTime (добавитьМинуты)

Возвращает копию исходного значения DateTime, к которой добавлено count минут. Пример:

x = DateTime(01.02.03, 04:05:06).addMinutes(10);           # 01.02.03 04:15:06.000

# addHours(amount: Number): DateTime (добавитьЧасы)

Возвращает копию исходного значения DateTime, к которой добавлено count часов. Пример:

x = DateTime(01.02.03, 04:05:06).addHours(10);           # 01.02.03 14:05:06.000

# addDays(amount: Number): DateTime (добавитьДни)

Возвращает копию исходного значения DateTime, к которой добавлено count дней. Пример:

x = DateTime(01.02.03, 04:05:06).addDays(10);           # 11.02.03 04:05:06.000

# addMonths(amount: Number): DateTime (добавитьМесяцы)

Возвращает копию исходного значения DateTime, к которой добавлено count месяцев. Пример:

x = DateTime(01.02.03, 04:05:06).addMonths(5);           # 01.07.03 04:05:06.000

# addYears(amount: Number): DateTime (добавитьГоды)

Возвращает копию исходного значения DateTime, к которой добавлено count лет. Пример:

x = DateTime(01.02.03, 04:05:06).addYears(5);           # 01.02.08 04:05:06.000

# add(field: String, amount: Number): DateTime (добавить)

Возвращает копию исходного значения DateTime, добавив к полю с именем field указанное число amount. Допустимые имена полей (регистрозависимые):

  • "milliseconds" ("миллисекунды")

  • "seconds" ("секунды")

  • "minutes" ("минуты")

  • "hours" ("часы")

  • "days" ("дни")

  • "months" ("месяцы")

  • "years" ("годы")

Пример:

x = DateTime(01.02.03, 04:05:06).add("hours", -1);    # 01.02.03 03:05:06.000

# format(fmt: String): String (форматировать)

Форматирует DateTime в соответствии со строкой формата fmt. Описание строки формата можно найти по ссылке (opens new window). Если строка формата невалидна, возникает исключение. Пример:

DateTime(1, 2, 2000, 3, 4, 5).format(`yyyy/MM/dd'T'HH:mm:ss`)     # "2000/02/01T03:04:05"

# Свойства

# millisecond: Real (миллисекунда)

Возвращает значение поля millisecond. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).millisecond;        # 7

# second: Real (секунда)

Возвращает значение поля second. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).second;             # 6

# minute: Real (минута)

Возвращает значение поля minute. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).minute;             # 5

# hour: Real (час)

Возвращает значение поля hour. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).hour;               # 4

# day: Real (день)

Возвращает значение поля day. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).day;                # 1

# month: Real (месяц)

Возвращает значение поля month. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).month;              # 2

# year: Real (год)

Возвращает значение поля year. Пример:

x = DateTime(1, 2, 3, 4, 5, 6, 7).year;               # 2003