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

ksi language

ksi - Язык программирования с динамической типизацией.

`plain 'Hello, World!' #echo #

Имена в ksi

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

Описание Пример
Типы начинаются с символа $ $bool $int $float $text
Переменные - без спец. символа a b c var1 var2
Функции - с символа & &test &new &main
Native-функции - с # #type #is #count
Ключевые слова, именованные операторы - с ` (backtick) `and `or `each
Текстовые литералы, состоящие из одного слова - со знака % %hello %world %123
Константы (в том числе и предопределённые) заканчиваются диезом hair_color# = 'red' n# -- "\n" s# -- ' ' FN#
Имена модулей начинаются с собачки @ @main @lib

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

Значением null для краткости является одиночный знак диез: x = #. Его тип - это $null

Булевы значения true и false – это #1 и #0 соответственно. Их тип $bool.

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

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

a = 1 b = 2

Запятой:

a = 1, b = 2

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

a = 1 b = 2

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

x = 10 + a x = 10 + a

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

(a + 5) * 2

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

x = (b = 1, b + 1) * 2 -- x = 4 y = (x == 4 ? a = #1, 'yes' | 'no' ;) -- y = 'yes'

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

'yes' => z -- z = 'yes'

Отрицательные значения

Чтобы указать отрицательное значение поставьте знак подчёркивания после числа.

x = 10_ -- Целое число минус десять y = 5.5_ -- Дробное число минус пять целых пять десятых

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

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

-- вычисление среднего значения элементов массива (average) &avg array any ~ (array #is $array) `and (array #count # => count) ? ret = (array #sum #) / count ; ; `plain # #echo> ([1 2 3] &avg #) -- вывод: 2

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

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

-- Определяем функцию &sum &sum left right ~ ret = left + right ; `plain -- Вызываем функцию &sum sum = 10 &sum 15 -- Печатаем результат на экран (выдаст 25) sum #echo #

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

Для вывода информации на экран служит native-функция #echo. Правый её аргумент – это разделитель.

t1 = 'Hello,' t2 = "world!" t3 = 'Goodbye.' [t1, t2, t3] #echo " " -- выдаст 'Hello, world! Goodbye.'

Ещё есть ключевое слово `echo. Оно ставится после выражения, значение которого необходимо вывести. Справа от `echo можно поставить дополнительные значения для вывода, перечисленные через необязательную запятую. Вконце конструкции `echo ставится точка с запятой.

0 `echo 1, 1+1, 3; -- Выдаст: 0123 "\n" `echo; -- Перевод строки. # `echo 'Hello,' " World" '!' ; -- Выдаст: Hello, World!

Для выводимых составных значений справа от `echo после двоеточия : можно указать разделитель, который работает аналогично как у native функции #echo.

# `echo [1 2 3] : ' ' "\n" {1:%one 2:%two} : [', ' ":"] ; /* результат: 1 2 3 1:one, 2:two */

Ключевое слово `echo пока не реализовано в интерпретаторе.

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

1_ #dump #0 -- 1_ [0 1] #dump #0 -- [0, 1] {'false':#0, %true:#1} #dump #1 /* { "false": #0 "true": #1 } */