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

ksi language

plain 'Hello, World!' &write

Имена в ksi

Существует определённое разграничение для имён функций, типов, переменных и т.д. Они начинаются с определённого символа или/и заканчиваются определённым символом.

Пример prefix   ending
Типы $person $
Стандартные типы $int# $bool# $null# $text# $ #
Переменные v.a v.b v.c v.var1 v.var2 v.
Функции &test &new &main &
Команды then else each
Текстовые литералы :hello :world :123 :
Константы v.hair_color# = :red v. #
Стандартные константы new_line# space# console# #
Имена модулей @main @lib @
Имена стандартных модулей @ksi# @wnd# @ #


Комментарии

Всё, что следует за последовательностью --, является однострочным комментарием, который заканчивается переводом строки, или концом файла.

-- привет v.x = 1 -- как дела?

Значения и типы

Имя любого типа в ksi начинается с символа $. У стандартных типов в конце ещё ставится символ #. Например значение 123 имеет стандартный тип $int#.

Но и сам тип тоже может быть значением выражения, которое можно присвоить переменной.

v.type = $int#

Оператор взятия типа – это символ $, находящийся непосредственно после имени переменной (без пробелов).

v.number = 123 v.type = number$ -- $int#

Чтобы применить оператор взятия типа для выражения, это выражение необходимо сперва заключить в круглые скобки, а $ поставить после закрывающей.

v.type = (1 + 5.5)$ -- $float#

Специальные значения

v.var1 = #
v.var2 = #1

Разделение выражений

Выражения в ksi могут разделяться переводом строки:

v.a = 1
v.b = 2

Запятой или точкой-с-запятой:

v.a = 1, v.b = 2 v.x = 10 ; v.y = 20

И даже пробелом:

v.a = 1 v.b = 2

Собственно запятая служит лишь для наглядности, и просто ставить её в конце выражения не является ошибкой.

v.array = [1, 2, 3,]

Кроме того система определит перенос одного выражения на несколько строк автоматически:

v.x = 10 + v.a v.x = 10 + v.a

Группировка выражений

У каждого оператора есть свой пироритет вычисления. Чтобы повлиять на порядок вычислений - выражение помещается в круглые скобочки.

(v.a + 5) * 2

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

v.x = ( v.b = 1 v.b + 1 ) * 2 -- v.x = 4, v.b = 1

Присваивание вправо

'yes' => v.z
v.z = 'yes'

Немного о функциях

Функции в ksi принимают всегда два обязательных аргумента – левый и правый. Для задания возвращаемого значения используется специальная переменная с именем ret. Её значение и будет возвращено в место вызова функции. Когда значение аргумента не важно – обычно используется null #. Если необходимо передать в функцию больше двух значений – воспользуйтесь составными типами, такими как: массив, ассоциативный массив, объект класса.

Вызов функции в ksi происходит подобно вызову операторов: a &my_function: b.

-- Определяем функцию &sum &sum args ( left right ) body ( ret = p.left + p.right ) plain -- Вызываем функцию &sum sum = 10 &sum: 15 -- Печатаем результат на экран (вывод: 25) sum &write

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

a &sum: b &write_line

У функций могут быть ещё дополнительные опциональные параметры (см. раздел Функции).

Части скрипта

Текст программы языка ksi делится на две части. До команды plain идёт декларативная часть. В ней помещаются определения функций и классов. После plain идёт императивная часть. Она служит для вычислений. Вычисления также находятся и в теле любой функции.

-- функция &sum вычисляет сумму элементов массива &sum args ( array ) body ( p.array each v.it ( ret += v.it.value ) ) -- функция &avg вычисляет среднее значение элементов массива (average) &avg args ( array ) body ( (p.array is $array#) && (p.array.count# => v.count) then ( ret = (p.array &sum) / v.count ) ) plain -- печатаем результат вызова функции &avg [1 2 3] &avg &write -- вывод: 2

Если императивная часть пуста, то plain можно не указывать.

Вывод информации на экран

Для вывода информации на экран служит стандартная функция &write.

t1 = 'Hello,' t2 = "world!" t3 = 'Goodbye.' -- Напечатаем массив, разделитель пробел: array (t1, t2, t3) &write [separator: " "] -- вывод: Hello, world! Goodbye.

Функция &write_line аналогична функции &write, но дополнительно она выводит перевод строки в конце.

И наконец существует стандартная функция &dump, которая выводит значения в виде ksi-выражения. Правый её аргумент отвечает за структурированность вывода. Выводит всё в одну строчку, если false #0; и разбивает на строчки, если true #1.

array (0 1) &dump: #0 -- array (0, 1) map ('false' : #0, "true" : #1) &dump: #1 /* map ( "false" : #0 "true" : #1 ) */