Functions

Basics

Functions in Oasis are first-class. That means they can be passed as arguments to other functions, and they can be returned by other functions. They are just like any other value.

Numeric and boolean arguments and return values are passed by value; but prototypes, lists, maps, strings, and functions are passed by reference.

let foo = 12

foo = fn
    io:print("foo function")
end

let f = fn(g, x)
    g(x)
end

Forms

Functions can be expressed in multiple ways.

A standard function:

let foo = fn(x, y)
    io:print("I was given " + x + " and " + y + ".")
end

foo("hello", "world")

An argumentless function:

let foo = fn
    io:print("I was called.")
end

foo()

A lambda function:

let foo = fn(x, y) => x + y
// these can also take no arguments
let foo = fn => "hello"

Blocks

If a function’s last operand takes a function, you can use block syntax when calling it.

let foo = fn(x, y, z)
    io:print(x + y)
    z()
end

foo(1, 2) do
    io:print("hello")
end

// prints "3 hello"
// One argument is supported, too

let infinitely = fn(x)
    while true
        infinitely()
    end
end

infinitely do
    io:print("hello") // will forever print "hello"
end