Result and Try:
Result carries recoverable failure, and ?= keeps success paths linear.
Ok
Ok(value) carries the successful result.
ok.brp
result: Result[Int, String] = Ok(42)Err
Err(error) carries the error value.
err.brp
result: Result[Int, String] = Err("missing score")Predictable Failure
A function returning Result[T, E] advertises that callers must handle failure.
result-signature.brp
pure func parse_score(raw: String) -> Result[Int, String]:
raw.parse_int().ok_or("bad score")?=
?= binds the success value or short-circuits with the error from a function returning Option or Result.
try-bind.brp
score ?= raw.parse_int().ok_or("bad score")
Ok(score + 1)Option-to-result
ok_or turns Option[T] into Result[T, E] when absence should become an error.
ok-or.brp
name ?= input("name> ").ok_or("no input")Example
parse-sum.brp
pure func parse_named_int(name: String, raw: String) -> Result[Int, String]:
raw
.parse_int()
.ok_or("invalid " + name)
pure func sum_two(left_raw: String, right_raw: String) -> Result[Int, String]:
left ?= parse_named_int("left", left_raw)
right ?= parse_named_int("right", right_raw)
Ok(left + right)
func main(args: List[String]) -> Void:
match sum_two("20", "22"):
Ok(total): print(total.to_string())
Err(msg): print(msg)
Try It
terminal
blorp run parse-sum.brp