Классы и объекты
Пока не реализовано в интерпретаторе.
Определение класса
$point2 ~
x y
;
Для свойств можно задать значения по умолчанию.
$point3 ~
(x y z) = 0
/*
x = 0
y = 0
z = 0
*/
;
Создание объекта через преобразование типов
$point2 ~
(x, y) = 0
;
`plain
o1 = # #as $point2
o1 #echo [', ' ":"] -- выдаст: x:0, y:0
n# #echo #
o2 = [10, 20] #as $point2
o2 #echo [', ' ":"] -- выдаст: x:10, y:20
n# #echo #
o2 = {%y:10_} #as $point2
o2 #echo [', ' ":"] -- выдаст: x:0, y:-10
Непосредственное создание объекта
$point ~ x y ;
`plain
-- Инициализация свойств по имени:
pt = $point{%x: 10, %y: 20}
-- Инициализация свойств по номеру:
pt = $point[10, 20]
-- Вывод на экран:
pt #dump #0
Для создания объекта таким образом между именем класса и фигурной/квадратной скобочкой не должно быть пробелов. Запятую между свойствами можно опустить. Для неуказанных свойств будет использовано значение по умолчанию. Если значение по умолчанию не указано для свойства в определении класса, то значит свойство будет равно # (null).
Непосредственное создание объекта являеется более предпочтительным способом, чем создание объекта через преобразование типов. Во-первых оно работает быстрее. Во-вторых интерпетатор проверит соответствие имён свойств и их количество на стадии загрузки файла скрипта.
Статические свойства
Статические свойства принадлежат самому классу, а не объекту этого класса. Они указываются после ключевого слова `static.
$player ~
name
score
`static
top1
;
`plain
$player.top1 = $player{%name:'Duke Nukem', %score:100500}
Константы класса
Константы класса в ksi – статические.
$game ~
board
players
win_message# = "Поздравляю, вы победили!"
;
`plain
$game.win_message# #echo #
Статические методы
Статический метод класса – это просто функция, статически перегруженная для этого класса. После определения ближайшего класса доступен краткий тип $, который равен тому классу.
$point2 ~
x, y
;
$circle ~
radius
position
;
-- статический метод класса $circle
&new $ t args ~
ret = args #as $
ret.position #as = $point2
;
`plain
obj = $circle &new {%radius:5, %position:[10, 10]}
Нестатические методы
-- точка
$point2 ~
x, y
;
-- прямоугольник
$rectangle ~
position
width
height
;
-- масштабирование
&scale $rectangle: obj factor ~
obj.width *= factor
obj.height *= factor
ret = obj
;
`plain
o = $rectangle{
%position: $point2[10, 10]
%width: 40
%height: 20
}
o &scale 0.5 #dump #1
Ещё пример:
$point ~ x y ;
$figure ~ position shape ;
-- shapes:
$square ~ side ;
$circle ~ radius ;
$rectangle ~ width height ;
-- actions:
&scale $figure: figure factor ~
ret = figure
figure.shape `each key : property& ~
property *= factor
;
;
&move_by $figure: figure delta ~
ret = figure
{%x: figure.position.x, %y: figure.position.y} += delta
;
`plain
$figure{
%position: $point[10 20]
%shape: $rectangle[100 50]
} => o #dump #1 &move_by $point[10_ 10] &scale 2 #dump #1
o.shape = $circle[25]
o #dump #1