fubark / cyber

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

Implement `catch`. #53

Closed colemanbroad closed 1 year ago

colemanbroad commented 1 year ago

on macos 12.5 with zig 0.11.0-dev.1899+8da6b393f

func foo():
    return error(#boom)

res = catch foo()
res = catch foo() then 123
res = catch foo() as err then 123

-- A catch block.
res = catch foo() then:
    break 123

with debug build returns a parse error

debug(parser): 0.0: parse error: error.ParseError Expected term expr. Parsed catch_k.
debug(parser): 0.0: catch foo()
res = ca
/Users/broaddus/py-shell/cyber/src/parser.zig:1765:9: 0x104b29677 in reportParseErrorAt (cyber)
        return error.ParseError;
        ^
/Users/broaddus/py-shell/cyber/src/parser.zig:1754:9: 0x104a7690f in reportParseError (cyber)
        return self.reportParseErrorAt(format, args, self.next_pos);
        ^
/Users/broaddus/py-shell/cyber/src/parser.zig:2487:21: 0x104c53f23 in parseTightTermExpr (cyber)
            else => return self.reportParseError("Expected term expr. Parsed {}.", &.{fmt.v(token.tag())}),
                    ^
/Users/broaddus/py-shell/cyber/src/parser.zig:2311:17: 0x104c57867 in parseTermExpr (cyber)
                return self.parseTightTermExpr();
                ^
/Users/broaddus/py-shell/cyber/src/parser.zig:2706:27: 0x104b27c5f in parseExpr (cyber)
                left_id = try self.parseTermExpr();
                          ^
/Users/broaddus/py-shell/cyber/src/parser.zig:2896:38: 0x104b2675f in parseExprOrAssignStatement (cyber)
                            right = (try self.parseExpr(.{})) orelse {
                                     ^
/Users/broaddus/py-shell/cyber/src/parser.zig:1489:25: 0x104a77777 in parseStatement (cyber)
                    if (try self.parseExprOrAssignStatement()) |id| {
                        ^
/Users/broaddus/py-shell/cyber/src/parser.zig:307:29: 0x104a76bc3 in parseBodyStatements (cyber)
                const id = (try self.parseStatement()) orelse break;
                            ^
/Users/broaddus/py-shell/cyber/src/parser.zig:229:28: 0x104a7c823 in parseRoot (cyber)
        const first_stmt = try self.parseBodyStatements(0);
                           ^
info(debug): parse: 256.125ms
ParseError: Expected term expr. Parsed catch_k.

/Users/broaddus/py-shell/cy/test1.cy:4:7:
res = catch foo()
fubark commented 1 year ago

catch and recover have not been implemented.

colemanbroad commented 1 year ago

ah ok of course. godspeed and thanks for the cool language 👍

fubark commented 1 year ago

Now that Cyber has moved to a try/catch mechanism, you can use try catch or try else for the same functionality. Please report an issue if anyone has trouble using them. Link to error handling docs: https://fubark.github.io/cyber/docs/toc/errors/