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