016 scope nested

✓ Passing This code compiles and runs correctly.

Code

// TEST: Nested scopes - each level tracks obligations separately
// STATUS: PENDING IMPLEMENTATION
//
// When scopes are nested (e.g., for inside for), each level should:
// - Track its own obligations
// - Auto-dispose inner scope obligations at inner scope exit
// - Preserve outer scope obligations until outer scope exit
//
// Here: Outer loop opens outer.txt, inner loop opens inner.txt
// Each inner iteration should close inner.txt
// Each outer iteration should close outer.txt (after inner loop completes)
//
// Expected: Compiles with correct open/close pattern

~import "$std/control"
~import "$app/fs"

~std.control:for(0..2)
| each _ |>
    app.fs:open(path: "outer.txt")
    | opened _ |>
        std.control:for(0..2)
        | each _ |>
            app.fs:open(path: "inner.txt")
            | opened _ |> _  // Auto-close inner here
        | done |> _  // Auto-close outer_f here
| done |> _

pub fn main() void {}
input.kz

Expected Output

Opening: outer.txt
Opening: inner.txt
Closing
Opening: inner.txt
Closing
Closing
Opening: outer.txt
Opening: inner.txt
Closing
Opening: inner.txt
Closing
Closing

Imported Files

// Library module: fs
// Single disposal event

const std = @import("std");

const File = struct { handle: i32 };

// Open a file - returns opened! state (requires cleanup)
~pub event open { path: []const u8 }
| opened { file: *File[opened!] }

~proc open {
    std.debug.print("Opening: {s}\n", .{path});
    const f = std.heap.page_allocator.create(File) catch unreachable;
    f.* = File{ .handle = 42 };
    return .{ .opened = .{ .file = f } };
}

// Close - the ONLY consumer of [!opened]
~pub event close { file: *File[!opened] }
| closed {}

~proc close {
    std.debug.print("Closing\n", .{});
    return .{ .closed = .{} };
}
fs.kz

Test Configuration

MUST_RUN