{"name":"calculator.nu","source":"// calculator.nu — Simple expression evaluator with enums and pattern matching\n//\n// Demonstrates:\n//   - Enum types with payloads (: | Name { ... })\n//   - Pattern matching (?? expr { ... })\n//   - Option type (?T) for error handling\n//   - Recursion\n//   - Heap allocation and pointers\n//\n// Build & run:\n//   ./build/nurlc examples/calculator.nu > /tmp/calc.ll\n//   clang /tmp/calc.ll stdlib/runtime.o -o /tmp/calc\n//   /tmp/calc\n\n// AST for arithmetic expressions\n: | Expr {\n    Num i\n    Add * Expr * Expr\n    Sub * Expr * Expr\n    Mul * Expr * Expr\n    Div * Expr * Expr\n}\n\n// Allocate an Expr on the heap\n@ box Expr e → *Expr {\n    : *Expr p # *Expr ( malloc Z Expr )\n    = . p 0 e\n    ^ p\n}\n\n// Evaluate an expression, returning None on division by zero\n@ eval * Expr e → ?i {\n    ?? . e 0 {\n        Num n → @ ?i { T n }\n\n        Add l r → {\n            : i a1 \\ ( eval l )\n            : i b1 \\ ( eval r )\n            ^ @ ?i { T + a1 b1 }\n        }\n\n        Sub l r → {\n            : i a2 \\ ( eval l )\n            : i b2 \\ ( eval r )\n            ^ @ ?i { T - a2 b2 }\n        }\n\n        Mul l r → {\n            : i a3 \\ ( eval l )\n            : i b3 \\ ( eval r )\n            ^ @ ?i { T * a3 b3 }\n        }\n\n        Div l r → {\n            : i dividend \\ ( eval l )\n            : i divisor \\ ( eval r )\n            ? == divisor 0\n            @ ?i { F 0 }\n            @ ?i { T / dividend divisor }\n        }\n    }\n}\n\n// Print result or error\n@ print_result ? i result → v {\n    ?? result {\n        T val → {\n            ( nurl_print `Result: ` )\n            ( nurl_print ( nurl_str_int val ) )\n            ( nurl_print `\\n` )\n        }\n        F → ( nurl_print `Error: division by zero\\n` )\n    }\n}\n\n@ main → i {\n    ( nurl_print `Calculator example\\n\\n` )\n\n    // Build: (10 + 5) * 2 = 30\n    : *Expr ten ( box @ Expr { Num 10 } )\n    : *Expr five ( box @ Expr { Num 5 } )\n    : *Expr two ( box @ Expr { Num 2 } )\n    : *Expr sum ( box @ Expr { Add ten five } )\n    : *Expr expr1 ( box @ Expr { Mul sum two } )\n\n    ( nurl_print `(10 + 5) * 2 = ` )\n    ( print_result ( eval expr1 ) )\n\n    // Build: 100 / (5 - 5) = error\n    : *Expr h ( box @ Expr { Num 100 } )\n    : *Expr f1 ( box @ Expr { Num 5 } )\n    : *Expr f2 ( box @ Expr { Num 5 } )\n    : *Expr zero ( box @ Expr { Sub f1 f2 } )\n    : *Expr expr2 ( box @ Expr { Div h zero } )\n\n    ( nurl_print `100 / (5 - 5) = ` )\n    ( print_result ( eval expr2 ) )\n\n    // Build: (8 - 3) * (4 + 2) = 30\n    : *Expr e8 ( box @ Expr { Num 8 } )\n    : *Expr e3 ( box @ Expr { Num 3 } )\n    : *Expr e4 ( box @ Expr { Num 4 } )\n    : *Expr e2 ( box @ Expr { Num 2 } )\n    : *Expr lhs ( box @ Expr { Sub e8 e3 } )\n    : *Expr rhs ( box @ Expr { Add e4 e2 } )\n    : *Expr expr3 ( box @ Expr { Mul lhs rhs } )\n\n    ( nurl_print `(8 - 3) * (4 + 2) = ` )\n    ( print_result ( eval expr3 ) )\n\n    ^ 0\n}\n","bytes":2869}