TL;DR: I’d like to be able to use @try or @? as macro names for try-catch-like syntax in code using Result types. Would this be reasonable to allow?
############
I’ve been exploring ResultTypes.jl as an alternative to throwing exceptions. I quite like it so far, but I found the code to be somewhat verbose:
Base.convert(::Type{FooError}, err::BarError) = FooError("Got a BarError: \$(err.msg)")
function foo(x)::Result{Int, FooError}
result = isbar(x) # result is a Result{Bool, BarError}
ResultTypes.iserror(result) && return unwrap_error(result)
is_b = unwrap(result)
return is_b ? 42 : 13
end
# ResultTypes.jl has `convert` methods for converting the return values
# above into the proper `Result` type.
Rust, in particular, uses Result (and similar types) exclusively, instead of exceptions. For the syntax above, they used to have a try! macro, which would look something like this in Julia:
function foo(x)::Result{Int, FooError}
is_b = @try! isbar(x) # expands to the version of foo() above
return is_b ? 42 : 13
end
This is much nicer!
Using try makes sense, because it’s playing the role of try-catch for Result types.
I would prefer @try over @try! (the ! in try! indicates a macro call in Rust; in Julia, it hints that we’re modifying an argument, but we’re not doing that here). However, try is a reserved word in Julia, and can’t be used for macro names.
Rust now actually uses ? to accomplish the same thing. In Julia, this would look like
function foo(x)::Result{Int, FooError}
is_b = isbar(x)? # doesn't actually work in Julia
return is_b ? 42 : 13
end
To somewhat mimic this, I also tried defining @? instead of @try, but that didn’t work either (? is syntax).
My question to the mainline devs: would it be reasonable to allow either of these to be used as macro names?
For anyone, any other ideas/suggestions on how to name or implement this? (See https://github.com/iamed2/ResultTypes.jl/pull/17 for the current pull request.)
Thanks!
Kevin