Tagging


Operators

Matching

r : # x / y {
    .value {[value] value }
    .error {[error] `log error; 0 }
}

Asserting

If no tag is specified for an operation, .value is used

An invalid assertion produces an Error with an .error tag

r : x /.value y
r : x / y // same as above

Lambdas

If no tag is specified .value is used, user defined coroutines don't have to have a .value tag

Returning

add : `{[I64 x; I64 y] `return.value x + y }
add : `{[I64 x; I64 y] .value x + y } // same as above
add : `{[I64 x; I64 y] x + y } // same as above
mu : `{[Bool i]
    ? i {
        .int 1
    } {
        .float 1.1
    }
}

Matching

// using the mu corotuine from above
i : # mu `sync `false {
    .int {[i] i }
    .float {[f] I64 f }
}

Asserting

// using the mu coroutine from aboce
i : mu `sync.int `true

Generators

Generators use a .done tag to denote when it is complete

gen : ^{[I64 n]
    @ 1 .. n {[x]
        `yield x
        // above is alias for -> `yield.value x
    }
    `done
}

it : gen `init 10

Matching

v : # `next it {
    .value {[x] x }
    .done { -1 }
}

Asserting

v : `next.value it
v : `next it // same as above

Tables

Creating

table : Table (.a 1; .b 1.1)

Accessing

`log table.a

Loops

Break

@.outer condtion {
    @ condition {
        `break.outer
    }
}

Continue

@ (x : 0; x < 10; x +: 2) {
    ? x < 5 { `continue }
    ...
}