# optionresult.ludic — the safety value types: `option` (some/none, "maybe a # value") and `result` (ok/err/try, "a value or a failure"). Each assertion that # holds prints its number, so a full run prints: # 1 2 3 4 5 6 7 8 9 10 11 12 # option is issue #53; result shipped in #46. Both are additive — a program that # does not use them compiles byte-identically. program OptionResult { # a lookup that may find nothing — no magic -1 sentinel function slot_of(id: int) -> option { if id < 0 { return none() } return some(id * 10) } # a fallible parse — a value or a message function to_digit(c: int) -> result { if c >= '0' and c <= '9' { return ok(c - 48) } # '0'..'9' return err("not a digit") } entry { # --- option --- let a = some(42) if is_some(a) { print(1) } if not is_none(a) { print(2) } if unwrap_or(a, -1) == 42 { print(3) } let b = none() if is_none(b) { print(4) } if unwrap_or(b, -1) == -1 { print(5) } if unwrap_or(slot_of(5), 0) == 50 { print(6) } if is_none(slot_of(-1)) { print(7) } # --- result + try/else --- if is_ok(to_digit(55)) { print(8) } if is_err(to_digit(120)) { print(9) } let d = try to_digit(55) else { 0 } # '7' -> 7 if d == 7 { print(10) } let bad = try to_digit(120) else { -1 } # not a digit -> fallback if bad == -1 { print(11) } let msg = try to_digit(120) else { print(12); 0 } # else binds `error` } }