238 lines
4.4 KiB
Plaintext
238 lines
4.4 KiB
Plaintext
==================
|
|
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))))))))))))
|
|
|
|
==================
|
|
Intrinsic calls
|
|
==================
|
|
|
|
main func() void {
|
|
_ = sizeof ! (i32)
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_declaration
|
|
(identifier)
|
|
(parameter_list)
|
|
(type
|
|
(builtin_type))
|
|
(block
|
|
(statement
|
|
(assignment_statement
|
|
(expression
|
|
(sink))
|
|
(expression
|
|
(intrinsic_call_expression
|
|
(identifier)
|
|
(argument_list
|
|
(expression
|
|
(builtin_type))))))))))
|
|
|
|
==================
|
|
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)))))))
|