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

Они предназначены для ограничения
на типы значений ячейки
при динамической типизации.

Перегрузка функции возможна
по категории типа первого параметра.

При определении типа можно указать
к какой категории он относится.

В ksi есть базовая категория _any@std
для остальных категорий и для всех типов.

Объявление категории

@nature _can_swim _can_fly -- Четыре Подкатегории для новой _alive _alive : (_fish _bird _reptile _animal) -- У _flying_fish две эти Надкатегории: _flying_fish ^ (_fish, _can_fly) -- Ещё пример: _bird : ( _swimming_bird ^ (_can_swim) ) -- База для _swimming_bird это _can_swim и _bird
ОкраскаКомментарии

Указание категории для типа

@nature $zebra : (_animal) = notion ( $text@std: %about = 'Полосатая лошадь' ) /* В разделе notion определили свойство %about для типа $zebra с категорией _animal */ $flamingo : (_bird, _can_fly) = notion ( $text@std: %about = 'Экзотическая птица' )
ОкраскаКомментарии

Проверка отношения к категории

@nature do ( ($zebra is _animal) and ($flamingo is _bird) and (_reptile is_not _can_fly) and ( $zebra.about <> $flamingo.about ) then ( &write_line('Проверка прошла успешно') ) )
ОкраскаКомментарии

Некорректное определение подкатегории

@test _outer : ( _mid1 _mid2 : ( /* Ошибка вложенности определения! */ _inner ) ) -- Корректный пример: _outer : ( _mid1 _mid2 ) _mid2 : ( _inner )
ОкраскаКомментарии