sum types: allow modification in `match`
parent
d918903252
commit
34e9eb32bb
|
@ -447,6 +447,7 @@ pub fn (a []char) index(v char) int {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
// []int.reduce executes a given reducer function on each element of the array,
|
// []int.reduce executes a given reducer function on each element of the array,
|
||||||
// resulting in a single output value.
|
// resulting in a single output value.
|
||||||
pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int {
|
pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int {
|
||||||
|
@ -457,6 +458,7 @@ pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int {
|
||||||
}
|
}
|
||||||
return _accum
|
return _accum
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// array_eq<T> checks if two arrays contain all the same elements in the same order.
|
// array_eq<T> checks if two arrays contain all the same elements in the same order.
|
||||||
// []int == []int (also for: i64, f32, f64, byte, string)
|
// []int == []int (also for: i64, f32, f64, byte, string)
|
||||||
|
|
|
@ -139,7 +139,9 @@ fn (p mut Parser) match_statement(is_expr bool) string {
|
||||||
// println('got child $sum_child_type')
|
// println('got child $sum_child_type')
|
||||||
p.register_var(Var{
|
p.register_var(Var{
|
||||||
name: 'it'
|
name: 'it'
|
||||||
typ: sum_child_type
|
typ: sum_child_type+'*'
|
||||||
|
is_mut: true
|
||||||
|
ptr: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -189,7 +191,8 @@ fn (p mut Parser) match_statement(is_expr bool) string {
|
||||||
p.check(.lcbr)
|
p.check(.lcbr)
|
||||||
p.genln('{ ')
|
p.genln('{ ')
|
||||||
if is_sum_type {
|
if is_sum_type {
|
||||||
p.genln(' $sum_child_type it = *($sum_child_type*)$tmp_var .obj ;')
|
//p.genln(' $sum_child_type it = *($sum_child_type*)$tmp_var .obj ;')
|
||||||
|
p.genln(' $sum_child_type* it = ($sum_child_type*)${tmp_var}.obj ;')
|
||||||
}
|
}
|
||||||
p.statements()
|
p.statements()
|
||||||
all_cases_return = all_cases_return && p.returns
|
all_cases_return = all_cases_return && p.returns
|
||||||
|
@ -261,12 +264,12 @@ fn (p mut Parser) if_statement(is_expr bool, elif_depth int) string {
|
||||||
name: var_name
|
name: var_name
|
||||||
typ: typ
|
typ: typ
|
||||||
is_mut: false // TODO
|
is_mut: false // TODO
|
||||||
|
|
||||||
is_used: true // TODO
|
is_used: true // TODO
|
||||||
// is_alloc: p.is_alloc || typ.starts_with('array_')
|
// is_alloc: p.is_alloc || typ.starts_with('array_')
|
||||||
// line_nr: p.tokens[ var_token_idx ].line_nr
|
// line_nr: p.tokens[ var_token_idx ].line_nr
|
||||||
// token_idx: var_token_idx
|
// token_idx: var_token_idx
|
||||||
|
|
||||||
})
|
})
|
||||||
p.statements()
|
p.statements()
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
|
|
|
@ -197,7 +197,12 @@ fn (c &Checker) stmt(node ast.Stmt) {
|
||||||
}
|
}
|
||||||
ast.VarDecl {
|
ast.VarDecl {
|
||||||
typ := c.expr(it.expr)
|
typ := c.expr(it.expr)
|
||||||
// println('var decl $typ.name it.typ=$it.typ.name $it.pos.line_nr')
|
// println('checker: var decl $typ.name it.typ=$it.typ.name $it.pos.line_nr')
|
||||||
|
/*
|
||||||
|
if typ.kind != .void {
|
||||||
|
it.typ = typ
|
||||||
|
}
|
||||||
|
*/
|
||||||
// if it.typ.kind == .unresolved {
|
// if it.typ.kind == .unresolved {
|
||||||
// it.ti = typ
|
// it.ti = typ
|
||||||
// println('unresolved var')
|
// println('unresolved var')
|
||||||
|
@ -284,22 +289,7 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type {
|
||||||
return c.selector_expr(it)
|
return c.selector_expr(it)
|
||||||
}
|
}
|
||||||
ast.IndexExpr {
|
ast.IndexExpr {
|
||||||
mut typ := c.expr(it.left)
|
return c.index_expr(it)
|
||||||
if typ.name.starts_with('array_') {
|
|
||||||
elm_typ := typ.name[6..]
|
|
||||||
// TODO `typ = ... or ...`
|
|
||||||
x := c.table.find_type(elm_typ) or {
|
|
||||||
c.error(elm_typ, it.pos)
|
|
||||||
exit(0)
|
|
||||||
}
|
|
||||||
typ = x
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
typ = table.int_type
|
|
||||||
}
|
|
||||||
return typ
|
|
||||||
// c.expr(it.index)
|
|
||||||
//return it.typ
|
|
||||||
}
|
}
|
||||||
ast.IfExpr {
|
ast.IfExpr {
|
||||||
typ := c.expr(it.cond)
|
typ := c.expr(it.cond)
|
||||||
|
@ -320,6 +310,25 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type {
|
||||||
return table.void_type
|
return table.void_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (c &Checker) index_expr(node ast.IndexExpr) table.Type {
|
||||||
|
mut typ := c.expr(node.left)
|
||||||
|
if typ.name.starts_with('array_') {
|
||||||
|
elm_typ := typ.name[6..]
|
||||||
|
// TODO `typ = ... or ...`
|
||||||
|
x := c.table.find_type(elm_typ) or {
|
||||||
|
c.error(elm_typ, node.pos)
|
||||||
|
exit(0)
|
||||||
|
}
|
||||||
|
typ = x
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
typ = table.int_type
|
||||||
|
}
|
||||||
|
return typ
|
||||||
|
// c.expr(it.index)
|
||||||
|
// return it.typ
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (c &Checker) error(s string, pos token.Position) {
|
pub fn (c &Checker) error(s string, pos token.Position) {
|
||||||
print_backtrace()
|
print_backtrace()
|
||||||
final_msg_line := '$c.file_name:$pos.line_nr: error: $s'
|
final_msg_line := '$c.file_name:$pos.line_nr: error: $s'
|
||||||
|
|
|
@ -11,6 +11,17 @@ struct User {
|
||||||
age int
|
age int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
struct One {
|
||||||
|
two Two
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Two {
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
a := 10
|
a := 10
|
||||||
//bb := 2 + 'hi'
|
//bb := 2 + 'hi'
|
||||||
|
|
|
@ -904,6 +904,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl {
|
||||||
|
|
||||||
ti: ti
|
ti: ti
|
||||||
}
|
}
|
||||||
|
// println('struct field $ti.name $field_name')
|
||||||
}
|
}
|
||||||
p.check(.rcbr)
|
p.check(.rcbr)
|
||||||
p.table.register_type(table.Type{
|
p.table.register_type(table.Type{
|
||||||
|
|
Loading…
Reference in New Issue