cyber icon indicating copy to clipboard operation
cyber copied to clipboard

Null Safety / Null Coalescing plans?

Open gnat opened this issue 1 year ago • 1 comments

Really like what I'm seeing so far with cyber. Thank you!

Congrats on the big 0.4 release.

Any plans for implementing an ergonomic null safe operator (or safe navigation operator or equivalent)? Use case:

my test = [ 'hello':'world', 'blah':'blah']
my output = ''
output = try "$(test.hello)"
print output -- world
output = try "$(test.hello.missing)"
print output -- none ... Awesome! Easy.
output = try "$(test.hello.missing.goodbye)"
print output -- panic: Field not found in value.

Would be great to see Cyber handling missing nested items in maps with try/catch or ideally implement question mark operators (?? and/or ?. etc)

Why bother? https://www.youtube.com/watch?v=XIhQYRNBAYs

Related: https://en.wikipedia.org/wiki/Null_coalescing_operator Related: https://en.wikipedia.org/wiki/Safe_navigation_operator

Proposal for Moonscript, which shares a similar syntax with Cyber: https://github.com/leafo/moonscript/issues/285

gnat avatar Jan 10 '24 08:01 gnat

Thanks for the references. Here's what I'm currently thinking for optionals:

Option declaration:

var a ?Foo = none
var a = ?Foo.none
var a ?Foo = [Foo:]
var a = some([Foo:])

Get value or panic: a! For optional chaining, returns last access or none: a?.b?.c Chain but fail at first none encounter: a!.b!.c If a is dynamic it can just be a.b.c

For null coalescing:

var res = a else 123
var res = a else:
    break 123

fubark avatar Jan 10 '24 15:01 fubark