Tzopilotl
Docs
GitHub

Tzopilotl by Example

18. Refs (Mutable References)

A Ref is a mutable container for a value. Create with &, dereference with *, and assign with <-.

18.1 Creating and Using Refs

-- Create a ref with &
let x = &42;
*x println;         -- 42 (dereference with *)

-- Mutate with <-
x <- 100;
*x println;         -- 100

-- Works with any type
let s = &"hello";
s <- "world";
*s println;         -- "world"

-- Explicit type annotation
let r Ref<Int> = &0;

-- Ref set returns the value
let v = (x <- 77);
v println;          -- 77

18.2 Refs as Function Arguments

fn increment(r Ref<Int>) Int {
    let old = *r;
    r <- *r + 1;
    old
}

let counter = &0;
counter increment println;   -- 0
counter increment println;   -- 1
*counter println;             -- 2

18.3 Overloading <-

struct Accumulator { total Ref<Int>, count Ref<Int> }

fn <-(acc Accumulator, val Int) Int {
    acc.total <- *(acc.total) + val;
    acc.count <- *(acc.count) + 1;
    val
}

let acc = Accumulator{&0, &0};
acc <- 10;
acc <- 20;
acc <- 30;
*(acc.total) println;    -- 60
*(acc.count) println;    -- 3