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

Пользовательские функции

Все функции в ksi принимают два аргумента – левый и правый. Возвращаемое функцией значение присваивается специальной переменной ret.

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

Определение фунцкции

Определения функций помещаются в декларативную часть файла (перед ключевым словом `plain).

&sum x y ~ x + y => ret ;

Вызов функции

&sum x y ~ x + y => ret ; `plain c = 5 &sum 4 -- c = 9

Перегрузка функций

Функция может быть перегружена для определённого типа левого аргумента.

-- перегрузка для типа $map &map_replace $map: map src ~ src #is $map ? map `each key : val& ~ src #has_key key ? val = src[key] ; ; ; ret = map ; -- &map_replace в общем виде &map_replace a b ~ FN# % ' ~ Первый аргумент должен быть типа $map.' #log # ; `plain {%x:0 %y:0 %z:0} => map &map_replace {%z:1 %y:1 %a:1} map #echo [n# ':'] /* Вывод: x:0 y:1 z:1 */

Также есть статическая перегрузка функции, при которой в определиении функции после типа не ставится знак : (двоеточие). Она используется если при вызове функции указанный тип передан левым аргументом в качестве значения.

&test $int v none ~ 'ver 1' #echo # ; &test $float v none ~ 'ver 2' #echo # ; `plain $int &test # n# #echo # -- перевод строки $float &test # n# #echo # -- перевод строки type = $text type &test # -- Ничего не делает, так как эта функция не перегружена статически для типа $text и не перегружена нестатически для типа $type и не задана в общем виде.

Поменять местами левый и правый аргумент при вызове функции

Для этого после имени функции ставится знак >.

array = [1 2 3] cnt = # #count> array -- cnt = array #count #

Вызов функции через указатель

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

Через указатель можно вызвать как пользовательские, так и native-функции. Для получения указателя после имени функции ставится знак & амперсанд. Для вызова через указатель используется символ ! восклицательный знак.

fn = #implode& -- указатель на функцию присваивается в переменную fn [1 2 3 4 5] => array array fn! ', ' => str -- str = '1, 2, 3, 4, 5'

Безымянные функции

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

Безымянные функции могут быть определены в императивной части скрипта, или в теле другой функции. Тип безымянной функции $closure.

`plain func = `fn x y ~ x + y => ret ; 1 func! 2 => c #echo # -- выдаст '3'