Functions

Basic syntax

function greet(String name) {
    Konsol:Print("Hello, " + name);
}

function add(Number a, Number b) : Number {
    return a + b;
}

greet("world");
Var:Number result = add(3, 4);

Parameter types can be written as Number x or Var:Number x — both work.

Return type annotation (: Number, : String, : Boolean) is required for non-void functions. Void functions omit the suffix.

Functions in expressions

Var:Number n = add(1, 2) * 10;   // 30

Recursion

Each call gets its own local scope; locals are erased after the call returns.

function factorial(Number n) : Number {
    if (n <= 1) { return 1; }
    return n * factorial(n - 1);
}

Var:Number result = factorial(5);
Konsol:Print(result);   // 120

Entry point

If the script defines a main function, it is called automatically. Global variable declarations are executed first to initialise globals.

Var:Number count = 0;   // initialised before main() runs

function main() {
    Konsol:Print(count);
}

If there is no main, all top-level statements execute in order.

Variables declared inside main() are properly scoped and cleaned up after main returns.


Examples

Functions

// 04_functions.ks — Functions, return values, recursion, use in expressions

Konsol:Print("=== Functions ===");

// Basic function
function greet(String name) {
    Konsol:Print("Hello, ${name}");
}

// Function with return value
function add(Number a, Number b) : Number {
    return a + b;
}

// Function with Var: param style
function multiply(Var:Number x, Var:Number y) : Number {
    return x * y;
}

// Multiple returns via early exit
function classify(Number n) : String {
    if (n < 0) { return "negative"; }
    if (n == 0) { return "zero"; }
    return "positive";
}

// Recursion — factorial
function factorial(Number n) : Number {
    if (n <= 1) { return 1; }
    return n * factorial(n - 1);
}

// Recursion — Fibonacci
function fib(Number n) : Number {
    if (n <= 1) { return n; }
    return fib(n - 1) + fib(n - 2);
}

// Function using another function
function sumOfSquares(Number a, Number b) : Number {
    return multiply(a, a) + multiply(b, b);
}

// ── Calls ──────────────────────────────────────────────────────────────────────

greet("world");
greet("minks");

Var:Number result = add(3, 4);
Konsol:Print("3 + 4 = ${result}");

Konsol:Print("6 * 7 = ${multiply(6, 7)}");

// Used directly in expression
Konsol:Print("add in expr   = ${add(10, 20) * 2}");
Konsol:Print("nested calls  = ${add(multiply(2, 3), multiply(4, 5))}");

Konsol:Print("classify -5   = ${classify(-5)}");
Konsol:Print("classify  0   = ${classify(0)}");
Konsol:Print("classify  9   = ${classify(9)}");

Konsol:Print("5! = ${factorial(5)}");
Konsol:Print("6! = ${factorial(6)}");

Konsol:Print("fib(7) = ${fib(7)}");
Konsol:Print("fib(10)= ${fib(10)}");

Konsol:Print("sumOfSquares(3,4) = ${sumOfSquares(3, 4)}");

Recursion

// Test: recursive functions — fib(n-1) + fib(n-2) must not destroy caller's locals

function fib(Var:Number n) {
    if (n <= 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

function factorial(Var:Number n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

// fib sequence: 0 1 1 2 3 5 8 13 21 34
Konsol:Print(fib(0));   // 0
Konsol:Print(fib(1));   // 1
Konsol:Print(fib(5));   // 5
Konsol:Print(fib(10));  // 55

// factorials
Konsol:Print(factorial(5));   // 120
Konsol:Print(factorial(10));  // 3628800

Default parameters

// 32_defaults.ks — Default parameter values

Konsol:Print("=== Default Parameters ===");

// primitive defaults
function greet(String name, String greeting = "Hello") {
    Konsol:Print(greeting + ", " + name + "!");
}

// all defaults
function counter(Number start = 0, Number step = 1) {
    Konsol:Print(start + step);
}

// mixed: first required, rest defaulted
function info(String label, Number value = 42, Boolean flag = true) {
    Konsol:Print("${label} ${value} ${flag}");
}

// class default
Class:Create(Point) {
    Var:Number x;
    Var:Number y;
}

function showPoint(Var:Point p = Point) {
    Konsol:Print("x=" + p.x + " y=" + p.y);
}

greet("Alice");              // Hello, Alice!
greet("Bob", "Hi");          // Hi, Bob!
counter();                   // 1
counter(10);                 // 11
counter(10, 5);              // 15
info("item");                // item 42 true
info("item", 7);             // item 7 true
info("item", 7, false);      // item 7 false
showPoint();                 // x=0 y=0