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

Классы и объекты

Пока не реализовано в интерпретаторе.

Определение класса

$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