## std.ast: Exposes the AST for building and operating on with macros. pub type Expr = union Ident(string) Number(int) Float(float) Char(chr) String(str) Struct(list[(field: str, value: Expr)]) Tuple(list[(field: str?, value: Expr)]) List(list[Expr]) Let(id: Pattern, kind: Type?, value: ref Expr) Var(id: Pattern, kind: Type?, value: ref Expr?) Const(id: Pattern, kind: Type?, value: ref Expr) FuncDecl( # effects? id: str, generics: list[GenericParams], params: list[FunctionParams], kind: Type, body: list[Expr]) TypeDecl(id: str, generics: list[str], alias: Type) Module(id: str, body: list[Expr]) Use(path: str) Pub(Expr) # can easily generate incoherent statements. still desired? Call(id: str, params: list[Expr]) Cond( branches: list[(cond: Expr, body: list[Expr])], else_body: list[Expr]?) Try( try_body: list[Expr], catches: list[(exceptions: list[str], body: list[Expr])], finally_body: list[Expr]?) Match( item: ref Expr, branches: list[(pattern: Pattern, guard: Expr?, body: list[Expr])]) Block(id: str?, body: list[Expr]) ConstBlock(body: list[Expr]), For(binding: Pattern, range: ref Expr, body: list[Expr]) While(cond: ref Expr, body: list[Expr]) Loop(body: list[Expr]), pub type Type = ref union Void Never Int(size: uint) Dec(size: uint) Float(size: uint) String Func(from: list[Type], to: Type) Struct(list[(id: str, kind: Type)]) Tuple(list[(id: str?, kind: Type)]) Union(list[(id: str, kind: Type)]) Class( # todo: generics funcs: list[(id: str, from: list[Type], to: Type?)] for_type: Type? ) Array(size: uint, kind: Type) List(Type) Slice(Type) # todo: plus ownership Alias(str) # todo: params?? huh? Static(Type) Lent(Type) Mut(Type) Ref(Type) Refc(Type) Ptr(Type) pub type Pattern = union Ident(str) Number(int), Float(float), Char(chr), String(str) Struct(name: str, params: list[Pattern]) Tuple(list[Pattern]) List(list[Pattern]) @[magic] pub func quote(body): Expr