Skip to content
Functions as values

Functions as values

You can pass a function as an argument to other functions, or assign them as values to variables.

// This function takes a function `operation` as its third parameter
// `operation` should be a function that takes in 2 int values and returns an int value
// Any function that doesn't match this signature will cause an error

fn calculator(int a, int b, (fn(int, int) int) operation) int {
  return operation(a, b)
}

test "function as argument" {
  // Don't need the full function signature in the type as this is a function definition
  fn add = fn(int a, int b) int {
    return a + b
  }

  int answer = calculator(3, 5, add)
  assert answer == 8
}

Whenever a function signature is used as a type, it must be surrounded with parentheses (fn(<type> arg_1, <type> arg_2, ...) <return type>). For example:

struct Calculator {
  (fn(int, int) int) add
  (fn(int, int) int) substract
  (fn(int, int) int) multiply
  (fn(int, int) int) divide
}