module foo; import std::io; tlocal String context_user = "safe"; macro long reallyPerform(task) { io::printfn("%s: %s", context_user, task); return task.len; } macro long perform(task) { return reallyPerform(task); } macro @with_mode(String user, #action, ...) { @scope(context_user) { context_user = user; return #action($vasplat); }; } fn void main() { long val1 = perform("something"); long val2 = @with_mode("faster", perform, "reliable"); long val3 = perform((String[]){"something"}); io::printfn("%d %d %d", val1, val2, val3); }