struct_method_dispatch/
struct_method_dispatch.rs1use keleusma::compiler::compile;
14use keleusma::lexer::tokenize;
15use keleusma::parser::parse;
16use keleusma::vm::{DEFAULT_ARENA_CAPACITY, Vm, VmState};
17use keleusma::{Arena, Value};
18
19fn main() {
20 let src = r#"
21 trait Doubler { fn double(x: i64) -> i64; }
22 impl Doubler for i64 { fn double(x: i64) -> i64 { x + x } }
23 struct Cell<T> { value: T }
24 fn main() -> i64 {
25 let c = Cell { value: 21 };
26 c.value.double()
27 }
28 "#;
29 let tokens = tokenize(src).expect("lex");
30 let program = parse(&tokens).expect("parse");
31 let module = compile(&program).expect("compile");
32 let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
33 let mut vm = Vm::new(module, &arena).expect("verify");
34 match vm.call(&[]) {
35 Ok(VmState::Finished(Value::Int(n))) => {
36 println!("Cell {{ value: 21 }}.value.double() = {}", n);
37 assert_eq!(n, 42);
38 println!("generic struct method dispatch executed end to end");
39 }
40 other => panic!("unexpected: {:?}", other),
41 }
42}