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

Система типов

Категории типов

Категории могут быть использованы для проверки значений и типов, а также для перегрузки функций.

Понятие "категория типа" в ksi подобно понятию 'интерфейс' в других языках программирования. Интерфейс – абстрактный класс, т.е. тип без экземпляров/значений.

Имя категории начинается с символа подчёркивание. А все стандартные категории ещё и заканчиваются символом диез, например _enum#.

Пример: Функция принимает целые и дробные числа для возведения их в квадрат.

&square args (n _simple_number#) body ( ret = p.n * p.n ) plain seq ( 5 &square, new_line 0.1 &square, new_line ) &write

Стандартные категории

Элементарные категории
_number#
_simple#
_compound#
_callable#
Подкатегории Включает категории
_simple_number# _simple# _number#
_enum# _simple#
_struct# _compound#

Определение пользовательских категорий

_some_category _sub_category ( _some_category )

Стандартные типы

Имя типа начинается с символа $. Имя стандартного типа дополнительно заканчивается символом диез, например $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#.

v.var = 5 v.cat = _simple# v.var is v.cat then ( '5 is simple' &write_line ) cat$ == $type_category# then ( 'simple is category' &write_line )

Тип $type_based#

Если поставить символ звёздочка непосредственно после имени типа, то такое значение уже примет тип $type_based#.

v.type = $type#* v.type$ == $type_based# then ( 'yes!' &write )

Тип со звёздочкой может быть использован для перегрузки функции или для проверки типов.

В случае перегрузки функции – функция будет подходить не только для значения заданного типа, но и для его подтипов.

$coords struct ( x y ) $coords3 extends ( $coords ) struct ( z ) -- перегружаем функцию для типа $coords и его наследников &move args ( point $coords* offset ) body ( ret = p.point += p.offset ) plain v.pt1 = $coords [10 20] &move array (-5 -5) v.pt1 &dump_line: #0 -- $coords [x: 5, y: 15] v.pt2 = $coords3 [10 20 30] &move array (-5 -5) v.pt2 &dump_line: #1 /* $coords3 [ x: 5 y: 15 z: 30 ] */

Пример с проверкой типа:

$coords struct ( (x y) = 0 ) $coords3 extends ( $coords ) struct ( z = 0 ) plain v.pt = $coords3 [z: 10] -- проверяем через $type_based# v.pt is $coords* then ('yes!' &write)