================== Core syntax ================== io :: import "@std/io" Status :: enum { ok bad } Pair :: struct { left i32 right i32 } sum func(a, b i32) i32 ! Status { result :: a + b if result > 0 { return result } else { return .bad } } --- (source_file (import_declaration (identifier) (string (string_content))) (type_declaration (identifier) (enum_type (enum_body (enum_member (identifier)) (enum_member (identifier))))) (type_declaration (identifier) (struct_type (record_body (record_field (identifier) (type (builtin_type))) (record_field (identifier) (type (builtin_type)))))) (function_declaration (identifier) (parameter_list (parameter (identifier) (identifier) (type (builtin_type)))) (type (builtin_type)) (type (named_type (qualified_identifier (identifier)))) (block (statement (constant_declaration (identifier) (expression (binary_expression (expression (identifier)) (expression (identifier)))))) (statement (if_statement (expression (binary_expression (expression (identifier)) (expression (integer)))) (statement (block (statement (return_statement (expression (identifier)))))) (statement (block (statement (return_statement (expression (enum_literal (identifier)))))))))))) ================== Errdefer ================== Failure :: enum { bad } work func() i32 ! Failure { errdefer cleanup() errdefer |err| { _ = err } return 1 } --- (source_file (type_declaration (identifier) (enum_type (enum_body (enum_member (identifier))))) (function_declaration (identifier) (parameter_list) (type (builtin_type)) (type (named_type (qualified_identifier (identifier)))) (block (statement (defer_statement (statement (expression_statement (expression (call_expression (expression (identifier)) (argument_list))))))) (statement (defer_statement (error_capture (identifier)) (statement (block (statement (assignment_statement (expression (sink)) (expression (identifier)))))))) (statement (return_statement (expression (integer))))))) ================== Bare return and value yield ================== done func() void { return } inline func() void { return } choose func() i32 { result :: { yield 1 } return result } --- (source_file (function_declaration (identifier) (parameter_list) (type (builtin_type)) (block (statement (return_statement)))) (function_declaration (identifier) (parameter_list) (type (builtin_type)) (block (statement (return_statement)))) (function_declaration (identifier) (parameter_list) (type (builtin_type)) (block (statement (constant_declaration (identifier) (block (statement (yield_statement (expression (integer))))))) (statement (return_statement (expression (identifier)))))))