Система типов
Категории типов
Категории могут быть использованы для проверки значений и типов, а также для перегрузки функций.
Понятие "категория типа" в ksi подобно понятию 'интерфейс' в других языках программирования. Интерфейс – абстрактный класс, т.е. тип без экземпляров/значений.
Имя категории начинается с символа подчёркивание. А все стандартные категории ещё и заканчиваются символом диез, например _enum#.
- Каждый тип в ksi может относится к одной или нескольким категориям. Например типы $int# и $float# относятся к категории _simple_number#.
- Категория может включать в себя одну или несколько других категорий. Тогда если какой-то тип относится к такой категории, то значит что он также относится и ко всем категориям, которые в неё включены.
- Если категория не включает ни одну другую категорию, то она называется элементарной.
- Иначе категория является подкатегорией.
Пример: Функция принимает целые и дробные числа для возведения их в квадрат.
Стандартные категории
|
|
Определение пользовательских категорий
Стандартные типы
Имя типа начинается с символа $. Имя стандартного типа дополнительно заканчивается символом диез, например $null#.
Некоторые типы могут наследоваться от одного или нескольких других типов. В этом случае такой тип автоматически относится ко всем категориям, к которым относятся все его базовые типы.
Базовый тип | Тип | Относится к категориям |
---|---|---|
$null# | _simple# | |
$bool# | _simple# | |
$text# | _compound# | |
$module# | _simple# | |
Числа | ||
$int# | _simple_number# | |
$float# | _simple_number# | |
$complex# | _number# _struct# | |
Типовые | ||
$type# | _simple# | |
$type# | $type_based# | _simple# |
$type# | $type_category# | _simple# |
Контейнеры | ||
$array# | _compound# | |
$map# | _compound# | |
Вызываемые | ||
$fn# | _callable# _simple# | |
$closure# | _callable# _compound# |
Категория или тип в качестве значения
Имя категории можно использовать как значение в выражениях и присваивать переменной. Типом такого значения будет $type_category#.
Аналогично и само имя типа тоже может быть значением, типом которго будет $type#.
Тип $type_based#
Если поставить символ звёздочка непосредственно после имени типа, то такое значение уже примет тип $type_based#.
Тип со звёздочкой может быть использован для перегрузки функции или для проверки типов.
В случае перегрузки функции – функция будет подходить не только для значения заданного типа, но и для его подтипов.
Пример с проверкой типа: