fubark / cyber

Fast and concurrent scripting.
https://cyberscript.dev
MIT License
1.16k stars 38 forks source link

Null Safety / Null Coalescing plans? #77

Open gnat opened 7 months ago

gnat commented 7 months ago

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

fubark commented 7 months ago

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