Skip to the content.

Функции

Синтаксис NewLang поддерживает два типа функций: обычные, чистые функции.

Оба типа функций поддерживаются аргументы по умолчанию. При создании функции, её аргументы указываются как в Python, т.е. вначале идут обязательные аргументы, потом аргументы со значениями по умолчанию, где имя аргумента отделяется от его значения по умолчанию знаком равно =. Если функция допускает обработку произвольного количества аргументов, то последним в списке параметров указывается многоточие … (три точки подряд) .

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

func(arg:<:Int8, :Int16, :Int32>): <:Int8, :Int16, :Int32> ::= {$arg*$arg};

Для создания объекта “функция” используются те же правила синтаксиса и операторы, что и для создания переменных, просто у имени функции обязательно должны быть круглые скобки.

Обычные функции

Обычная функция — такие функции являются именно обычными функциями в понимании С/С++. Внутри них можно писать совершенно любой код, включая проверки условий, циклы, вызовы других функций и т.д.

hello(str) := { 
  $printf := :Pointer('printf(format:FmtChar, ...):Int32');
  $printf('call: %s', $str);
  $str;
};
hello('Привет, мир!');

Чистые функции

Чистая функция — это тоже обычная функция, только в том смысле, какой в него вкладывает функциональное программирование. Создание чистой функции происходит с помощью операторов :- или ::-, а сам оператор заимствован из языка Пролог. У чистой функции отсутствует доступ к контексту и глобальным переменным, поэтому она может обрабатывать только те данные, которые были ей переданы в качестве аргументов.

Sum1(arg1, arg2) :- {$arg1+$arg2;}; # Создать или переопределить простую функцию, которая возвращает сумму аргументов
Sum2(arg1, arg2) ::- {$arg1+$arg2;}; # Тоже самое, но если функция с таким именем уже существует, то будет ошибка