11.4. with_ macro: locked array/table element binding

The WITH_BOOST module provides the with_ call macro: bind one or more array / table element references inside a block, with an automatic container lock around the body so push / erase / resize / clear inside the body panic at runtime instead of silently dangling. The macro emits the lock / invoke / unlock sequence fully inline, so any arity and any mix of array / table args work uniformly with a single require.

All functions and symbols are in “with_boost” module, use require to get access to it.

require daslib/with_boost

Example:

require daslib/with_boost

struct A {
    f1 : int
    f2 : int
}

[export]
def main {
    var arr = [A(f1=1, f2=2), A(f1=3, f2=4)]

    // single-arg, default `_` binding
    with_(arr[0]) {
        _.f1 = 99
    }

    // multi-arg positional, struct + workhorse
    var ints = [10, 20, 30]
    with_(arr[1], ints[0]) $(s, n) {
        s.f1 = n + 100
    }

    print("arr[0]={arr[0].f1}, arr[1]={arr[1].f1}\n")
    // output: arr[0]=99, arr[1]=110
}

11.4.1. Call macros

with_

Implements the with_ call macro. Each container arg must be an ExprAt (arr[i] / tab[k]); at most one table-keyed arg per call. Emits a pre-bind / lock / invoke / unlock sequence inline per container, with block-param types pinned to T & (element ref) so workhorse and struct elements mutate uniformly.