Closures

A closure in Dyon is a variable that works similar to a mathematical function.

#![allow(unused)]
fn main() {
a := \(x) = x + 1
}

You can print out a closure:

#![allow(unused)]
fn main() {
// prints `\(x: any) = x + 1`
println(\(x) = x + 1)
}

To call a closure, use the \ character before the name:

#![allow(unused)]
fn main() {
a := \(x) = x + 1
println(\a(0)) // prints `1`
}

Calling closures on objects

When an object stores a closure, you can call it with named arguments:

fn main() {
    gollum := {say__msg: \(msg) = "My precious " + msg}
    // prints `my precious ring`
    println(\gollum.say(msg: "ring"))
}

Grab

Use grab to compute a value and insert it into a closure:

#![allow(unused)]
fn main() {
a := 2
b := \(x) = (grab a + 2) + x
// prints `\(x: any) = 4 + x`
println(b)
}

When a closure is inside another closure, you can use grab '2:

#![allow(unused)]
fn main() {
a := 2
b := \(x) = \(y) = (grab '2 a) + (grab x) + y
// prints `\(x: any) = \(y: any) = 2 + (grab x) + y`
println(b)
// prints `\(y: any) = 2 + 0 + y`
println(\b(0))
}

You can use grab 'N where N is the level you want to compute from.

Pro tip: Pre-compute as much as possible with grab to improve performance.