generic_match/
generic_match.rs1use keleusma::compiler::compile;
7use keleusma::lexer::tokenize;
8use keleusma::parser::parse;
9use keleusma::vm::{DEFAULT_ARENA_CAPACITY, Vm, VmState};
10use keleusma::{Arena, Value};
11
12fn run(label: &str, src: &str) -> Value {
13 let tokens = tokenize(src).expect("lex");
14 let program = parse(&tokens).expect("parse");
15 let module = compile(&program).expect("compile");
16 let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
17 let mut vm = Vm::new(module, &arena).expect("verify");
18 match vm.call(&[]) {
19 Ok(VmState::Finished(v)) => {
20 println!("{}: {:?}", label, v);
21 v
22 }
23 other => panic!("{}: {:?}", label, other),
24 }
25}
26
27fn main() {
28 let r1 = run(
29 "pattern match on generic enum",
30 r#"
31 enum Maybe<T> { Just(T), Nothing }
32 fn main() -> i64 {
33 let m = Maybe::Just(42);
34 match m {
35 Maybe::Just(x) => x,
36 Maybe::Nothing => 0,
37 }
38 }
39 "#,
40 );
41 assert_eq!(r1, Value::Int(42));
42
43 let r2 = run(
44 "nested generic structs",
45 r#"
46 struct Cell<T> { value: T }
47 struct Wrap<T> { inner: Cell<T> }
48 fn main() -> i64 {
49 let w = Wrap { inner: Cell { value: 7 } };
50 w.inner.value
51 }
52 "#,
53 );
54 assert_eq!(r2, Value::Int(7));
55
56 println!("all generic_match probes passed");
57}