Functions
Functions are reusable blocks of code that can accept parameters and return values.
Function Declaration
Basic Syntax
fun functionName(parameters) returnType { // body return value}Examples
// Simple functionfun greet() string { return "Hello, World!"}// Function with parametersfun add(number x, number y) number { return x + y}// Function with no return valuefun logMessage(string message) { print(message)}Parameters
Typed Parameters
fun multiply(number a, number b) number { return a * b}fun formatName(string first, string last) string { return "${first} ${last}"}Multiple Parameters
fun createUser(string name, number age, boolean active) object { return { name: name, age: age, active: active }}Array Parameters
fun sum(number[] numbers) number { var total = 0 for n in numbers { total += n } return total}fun first(string[] items) string { return items[0]}Return Types
Explicit Return Type
fun getPort() number { return 8080}fun getName() string { return "default"}fun isEnabled() boolean { return true}Complex Return Types
fun getConfig() object { return { host: "localhost", port: 8080 }}fun getPorts() number[] { return [80, 443, 8080]}Function Return Types
Functions can return other functions:
fun outer(number x, number y) (number) -> number { fun inner(number p) number { return p + x + y } return inner}var adder = outer(10, 20)var result = adder(5) // 35Function Calls
// Simple callvar message = greet()// With argumentsvar total = add(5, 3)// Chained callsvar doubled = multiply(add(2, 3), 2) // 10// With variablesvar x = 10var y = 20var sum = add(x, y)Lambda Expressions
Basic Syntax
(parameters) -> expression(parameters) -> { statements }Examples
// Simple lambdavar double = (x) -> x * 2// With type annotationsvar add = (number a, number b) -> a + b// Block bodyvar process = (string input) -> { var upper = toUpperCase(input) return upper}Using Lambdas
// Assign to variablevar square = (x) -> x * xvar result = square(5) // 25// Pass to higher-order functionvar numbers = [1, 2, 3, 4, 5]var doubled = map(numbers, (n) -> n * 2)// Result: [2, 4, 6, 8, 10]// Filter with lambdavar evens = filter(numbers, (n) -> n % 2 == 0)// Result: [2, 4]Type Aliases for Functions
// Define function typestype MathOp = (number, number) -> numbertype Predicate = (string) -> booleantype Transformer = (object) -> object// Use in declarationsvar MathOp add = (a, b) -> a + bvar MathOp multiply = (a, b) -> a * bHigher-Order Functions
Functions that take or return other functions:
// Function that takes a functionfun applyTwice((number) -> number f, number x) number { return f(f(x))}var result = applyTwice((n) -> n * 2, 5) // 20// Function that returns a functionfun makeMultiplier(number factor) (number) -> number { return (x) -> x * factor}var triple = makeMultiplier(3)var result = triple(10) // 30Init Blocks
Init blocks run initialization code within components:
component Server { input string name var string normalizedName init() { normalizedName = toLowerCase(name) } resource EC2.Instance server { name = normalizedName }}Init with Parameters
init(string prefix, number count) { // initialization code}Function Decorators
@description("Calculate the area of a rectangle")fun area(number width, number height) number { return width * height}Recursion
Functions can call themselves:
fun factorial(number n) number { if n <= 1 { return 1 } return n * factorial(n - 1)}var result = factorial(5) // 120Closures
Inner functions capture variables from outer scope:
fun makeCounter() () -> number { var count = 0 return () -> { count++ return count }}var counter = makeCounter()counter() // 1counter() // 2counter() // 3Next: Learn about Control Flow - if/else, loops, and comprehensions.