Acquis 23 - Do Expressions

This manual page contains unstable information and its contents may change at any time.

Do expressions are do/end blocks that evaluate to the value returned through the provide keyword.

Basic usage

Do expressions can be used anywhere an expression is allowed. The expression will be evaluated to the value returned through the provide keyword.

local x = do
    local y = 10
    provide y
end
assert(x == 10)

local z = 5 + do provide 10 end
assert(z == 15)

print(do provide local foo = "bar" provide "hello from " .. foo end) -- prints "hello from bar"

If no value is provided through the provide keyword, the do expression will evaluate to nil.

local x = do
    local y = 10
end
assert(x == nil)

Multiple values can be provided, which will fill any local variables in order.

local x, y = do
    provide 10, 20
end
assert(x == 10 and y == 20)

Catch expressions

Do expressions naturally integrate with the catch expression and serve as a more performant pcall-like construct.

local ok, x = catch do
    provide 10
end
assert(ok and x == 10)

Use with group statements

Do expressions can be used with group local variables to initialize them.

local x <group> = do
    local y <group> = { a = 1, b = 2 }
    provide y
end
assert(x.a == 1 and x.b == 2)