Синтаксис ksi

Назначение языка ksi - для любых целей.

Имена и типы файлов

_.define
Расширение для файла определений (типов, действий, функций).
_.run
Расширение для файла запуска.
define.priority
Последовательность чтения файлов с определениями.
run.order
Порядок выполнения файлов запуска.

Пример файла: define.priority

Пример:
.default_extension = ".define" some_module "also.module.define"
Дополнительные параметры:
.autoload_unlisted_files = 0
.require_forward_declaration = 0
.require_unique_names = 0

Разграничение имён

@module
Модуль
@some_module -- Файл с именем "some_module.define"
_category
Категория типа
$type
Тип данных
Тип с одним и тем-же именем может быть определён в разных модулях.
В этом случае для типа можно указать конкретный модуль:
$sample@lib -- тип $sample из модуля "lib.define"
Если модуль не указан, то будет использован модуль, который прочитан раншье.
%param
Параметр шаблона
&write
Действие
&write:
Функция
#filter #adapter #wrapper
Helpers
type_of
сommand

Области видимости

v.
variables
e.
environment
s.
system
p.
parameters (in function)
a
argument is first parameter of function
ret
returned value (in function) same as v.ret

Операторы

(expression)$
Взятие типа у выражения
v$ == (type_of v) == $scope
$int$ == $type == $type$
@some_module$ == $module
&write.action
Взять адрес действия
v.action = &write.action
v.action$ == $action
&write.function
Взять адрес функции
v.function = &write.function
v.function$ == $function
!v.action
Вызвать действие по адресу
seq (s.console, 1, 0) !v.action
v.action( seq (s.console, 1, 0) )
!v.function:
Вызвать функцию по адресу
s.console !v.function: seq (1, 0)
v.function( s.console, seq (1, 0) )

Команды

Для данных
struct -- $sample struct ( object-properties )
enum -- $sample enum ( элементы-перечисления )
bitset -- $sample bitset ( flag-names )
variant -- $sample variant ( пары )
-- $sample variant ( bar $bar_code, qr $qr_code )
-- $sample variant ( nothing $null, bar $bar_code, qr $qr_code )
Дополнительно для данных
category -- $sample category (_some_category _another_category) -- Принадлежность типа к указанным категориям.
notion -- $sample notion ( статические-свойства )
nest -- Вложенные определения типов. -- $sample nest ( $alias = $int )
extends -- $sample extends ( $sample_base $sample_also )
-- Наследование от указанных типов.
template -- $sample template ( -- %type $type -- %size $size -- ) struct ( items $fixed_array {%type %size} )

Условие: then else

-- Условие: then else -- a then b a then b else c /* Ветвление, исходя из условия. условие then операнд /* Без else then Вернёт операнд, если условие правдиво. Иначе вернёт значение проверяемого условия. */ условие then ( выражения ) /* Если условие правдиво, то then выполнит все выражения, которые в скобках, и вернёт результат последнего из них. Иначе вернёт значение проверяемого условия. */ условие then ( выражения_затем ) else ( выражения_иначе ) /* Если условие правдиво, то then выполнит выражения_затем, и вернёт значение последнего из них. Если условие ложно, то else выполнит выражения_иначе, и вернёт значение последнего из них. */ */ v.a = 1 v.a < 10 then ( v.b = 0 v.a + 10 ) => ret -- ret == 11 -- v.b == 0 ret = ( ret < 10 then ( v.b = 10 ) else ( v.b = 20 v.a ) ) -- ret == 1 -- v.b == 20

Цепочка условий: then else

-- Цепочка условий: then else -- a then b then c /* a then (b then c) */ a then b else c then d /* a then b else (c then d) */ a then b then c else d /* a then (b then c else d) */

type_alias

-- type_alias -- $small_int = $integer_16_signed $small_uint type_alias $integer_16_unsigned

struct, extends

-- struct, extends -- /* Структура - это тип данных, хранящий набор свойств объекта. */ -- sample.struct.define -- $coords_2d struct ( x $floating_64 y $floating_64 ) -- $coords_2d struct $floating_64 ( x y ) /* Для структуры наследование допустимо: от других структур, или от абстрактных типов. */ $coords_3d extends ( $coords_2d ) struct ( z $floating_64 default 0 ) -- sample.struct.run -- v.point = $coords_3d [10 10] v.point.z == 0 then (s.console &write: 'All fine!')

enum, extends

-- enum, extends -- /* Перечисление - это тип данных, хранящий одно из указанных состояний. */ -- sample.enum.run -- $easy_answer enum ( yes no ) /* Для перечисления наследование допустимо: от других перечислений, или от абстрактных типов. */ $answer extends ( $easy_answer ) enum ( maybe i_dont_know ) -- sample.enum.run -- v.reply = $answer.maybe

Выбор: switch

-- Выбор: switch -- v.x = 10 v.x switch ( [0] : 'zero' [1 2 3] : 'small value' (v.x < 0) : 'negative value' any : 'big value' ) => ret -- ret = 'big value' /* проверяемое_значение switch ( [список_возможных_значений] : операнд (условие) : операнд any : операнд ) /* В качестве операнда может быть список выражений, заключённый в круглые скобки. */ -- Тело switch не может быть пустым. /* Допустимо: -- Любое количество позиций со списком значений (хоть 0). -- Любое количество позиций с условием (хоть 0). Однако: -- Позиции со списком значений должны находиться перед позициями с условием. -- Позиция any должна быть последней, но она необязательна. */ */ 5 => v.x switch ( [5] : ( s.console &write: 'Точное попадание!' 'equal' ) [4 6] : 'very close' (v.x < 5) : 'less' any : 'greater' ) => ret -- ret == 'equal' -- sample.switch.enum.define -- $answer enum (yes no maybe) -- sample.switch.enum.run -- (v.reply = $answer.no) switch ( [$answer.yes]: 'sure we can go' any: "we don't go" ) => ret s.console &write: seq (ret new_line)

notion

-- notion -- /* Понятие служит для хранения статических свойств. */ -- sample.notion.define -- $config notion ( textures_dir = '{game_path}/img/' save_path = '{local_user}/save/' ) $player struct ( name $text score $integer_32_signed ) $game notion ( top_player $optional { $player } default_difficulty = $.normal ) enum ( easy normal hard ) -- sample.notion.run -- $game.top_player is $null then( $game.top_player = $player ['Duke' 500] )

template, nest

-- template, nest -- /* nest Позволяет определить вложенные типы. template Позволяет параметризовать форму типа. */ -- sample.template.define -- $coords_3d template ( %axis $type ) nest ( $axis = %axis ) struct %axis ( x y z ) -- определим type_alias на подстановку шаблона $coords_3d_int = $coords_3d { $integer_fast_signed } -- sample.template.run -- v.point = $coords_3d_int [10 10] v.point.z = (5.5 as $coords_3d_int.$axis) v.point == $coords_3d {$integer_fast_signed} [10 10 5] -- полная подстановка шаблона v.point == $coords_3d [10 10 5] -- автоопределение параметров шаблона v.point$ == $coords_3d {$integer_fast_signed} -- проверка типа