В Cpp2 используется унифицированный вызов функции и метода.
Например, метод ``length`` для ``std::string`` можно вызвать как
``s.length()`` или ``length(s)`` и, наоборот, функцию ``sqrt(x)`` можно вызвать как метод: x.sqrt().
**Определение функции**
Функции определяются в любом порядке, Cpp2 автоматически добавляет заголовки всех функций в начало сгенерированного кода на С++.
Для функции, которая ничего возвращает, ``->`` *тип_результата* не указывается.
Параметры указываются через запятую.
Для каждого параметра может быть опционально указан тип передачи аргумента: ``in``, ``copy``, ``inout``, ``out``, ``move``, ``forward``. По умолчанию ``in``. ``inout`` соответствуют передаче аргумента по ссылке, ``out`` означает, что переменная может не иметь начального значения, значение ей будет присвоено в функции. ``move`` означает перемещение объекта, ``forward`` -- передача ссылки на временное значение, без перемещения.
Вместо типа параметра можно указать ``_``, либо не указывать вообще, тогда тип аргумента ``auto`` (функция-шаблон). Для типа результата можно указать ``move`` (ссылка на временное значения) и ``forward`` (ссылка на значение).
```c++
factorial:(n:int)->int=
(inspect n->int {
is 0 =1;
is 1 =1;
is _ = n * (n-1).factorial();
});
inc:(inout x:_)= x++;
init:(out x:_)= x=0;
main:() -> int {
a:int;
init(out a);
inc(a);
}
```
Если функция возвращает несколько значений, в качестве типа указывается список возвращаемых параметров в круглых скобках. Функция возвращает структуру с указанными именами полей. Параметрам нужно присвоить значения в теле функции.