- 实现 as 类型转换运算符、修复 &&/|| 短路求值 bug。 - 在 splc1.spl 中实现 Vec/Map/Emit 基础库(~50 个方法)。 - 修复实例方法调用中 self 参数被错误丢弃的 bug。
49 lines
1.1 KiB
Plaintext
49 lines
1.1 KiB
Plaintext
/* ===== 模块7:高级特性 =====
|
||
* test16_methods — 类型关联方法
|
||
* 难度:3/5
|
||
* 验证点:struct 方法、enum 方法、self 参数自动填充、方法调用
|
||
*/
|
||
@extern(vm) fn vm_printf(fmt: *u8, ...) void;
|
||
|
||
type Point = struct {
|
||
x: i32,
|
||
y: i32,
|
||
|
||
fn init(x: i32, y: i32) Point {
|
||
ret Point { .x = x, .y = y };
|
||
}
|
||
|
||
fn dump(self: *Point) void {
|
||
vm_printf("Point(%d, %d)\n", self.x, self.y);
|
||
}
|
||
}
|
||
|
||
type Expr = enum {
|
||
Int: i32,
|
||
Add: struct { left: *Expr, right: *Expr },
|
||
|
||
fn eval(self: *Expr) i32 {
|
||
match self {
|
||
.Int(val) => ret val,
|
||
.Add(left, right) => ret eval(left) + eval(right),
|
||
}
|
||
ret 0;
|
||
}
|
||
}
|
||
|
||
fn main() i32 {
|
||
/* struct 方法调用 */
|
||
var p: Point = Point.init(3, 4);
|
||
p.dump(&p);
|
||
|
||
/* enum 方法 + match */
|
||
var expr_l := Expr { .Int = 3 };
|
||
var expr_r := Expr { .Int = 4 };
|
||
var expr := Expr { .Add = { .left = expr_l, .right = expr_r } };
|
||
var result := expr.eval(&expr);
|
||
vm_printf("eval result: %d\n", result);
|
||
if result != 7 { ret 1; }
|
||
|
||
ret 0;
|
||
}
|