## Function Functions are first class objects like [Int](types.md) or [String](types.md) and can be stored in local variables (even in [Lists](list.md) or [Maps](map.md)), passed as function parameters or returned by a function. Functions can be implemented in Gravity or in a [native language](api.md) with calling conventions compatible with ANSI C.

Functions are called by value. This means that foo(1) calls the function which is the value of the variable foo. Calling a value that is not a function (or does not implement the exec method) will raise a runtime error. ```swift func main() { var a = 10; var b = 20; return a + b; } ``` ```swift func f1() { return 10; } func f2() { return f1; } func main() { // a is now function f2 var a = f2; // b is now the return value of f2 which is function f1 var b = a(); // return value is f1() which is 10 return b(); // above code is equivalent to return f2()(); } ``` ### Function parameters Functions aren’t very useful if you can’t pass values to them so you can provide a parameter list in the function declaration. Gravity performs no check on the number of parameters so you can call a function providing more or less parameters. ```swift func sum(a, b) { return a + b; } // execute the sum function // and returns 30 as result sum(10,20); ``` If a function is called with missing arguments (less than declared), the missing values are set to **undefined**. ```swift // sum modified to take in account missing arguments func sum(a, b) { // equivalent to if (a == undefined) a = 30; if (!a) a = 30; // equivalent to if (b == undefined) b = 50; if (!b) b = 50; return a + b; } // execute the sum function without any argument // a has a 30 default value and b has a 50 default value // return value is 80 sum(); ``` If a function is called with more arguments (more than declared), the additional arguments can be accessed using the **_args** array. ```swift // sum modified to accept a variable number of arguments func sum() { var tot = 0; for (var i in 0..<_args.count) { tot += _args[i]; } return tot; } // execute the sum function with a variable number // of arguments returns 550 as result sum(10,20,30,40,50,60,70,80,90,100); ``` ### Recursion Function recursion is fully supported in Gravity (current function can be accessed using the _func reserved keyword): ```swift func fibonacci (n) { if (n<2) return n; // could be written as return _func(n-2) + _func(n-1) return fibonacci(n-2) + fibonacci(n-1); } func main() { return fibonacci(20); } ``` ### Returning values A function without a return statement returns **null** by default. You can explicitly return a value using a return statement.