Категории типов в 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
)
ОкраскаКомментарии