use keleusma::compiler::compile;
use keleusma::lexer::tokenize;
use keleusma::parser::parse;
use keleusma::utility_natives::register_utility_natives;
use keleusma::vm::{DEFAULT_ARENA_CAPACITY, Vm, VmState};
use keleusma::{Arena, Value};
fn main() {
let src = r#"
use to_string
use concat
use slice
fn main() -> String {
let name = "Keleusma";
let n: i64 = 42;
let greeting = f"hello, {name}! n = {n}";
let head = slice(greeting, 0, 5);
concat(head, "...")
}
"#;
let tokens = tokenize(src).expect("lex");
let program = parse(&tokens).expect("parse");
let module = compile(&program).expect("compile");
let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
let mut vm = Vm::new(module, &arena).expect("verify");
register_utility_natives(&mut vm);
match vm.call(&[]) {
Ok(VmState::Finished(Value::DynStr(s))) => {
println!("result: {}", s);
assert_eq!(s, "hello...");
println!("string ops executed end to end");
}
other => panic!("unexpected: {:?}", other),
}
}