From d9bda8ed4ff50ee82608e48a6ab8cdd5680b668c Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 27 Apr 2024 23:00:15 +0200 Subject: rebel-lang: add type checking to REPL --- crates/rebel-lang/examples/repl.rs | 16 +++++- crates/rebel-lang/examples/type-string.rs | 84 ------------------------------- 2 files changed, 15 insertions(+), 85 deletions(-) delete mode 100644 crates/rebel-lang/examples/type-string.rs (limited to 'crates') diff --git a/crates/rebel-lang/examples/repl.rs b/crates/rebel-lang/examples/repl.rs index f7d29e3..0e3debc 100644 --- a/crates/rebel-lang/examples/repl.rs +++ b/crates/rebel-lang/examples/repl.rs @@ -65,6 +65,13 @@ fn main() -> rustyline::Result<()> { continue; } }; + match Type::ast_expr_type(&ctx, &expr) { + Ok(_) => (), + Err(err) => { + println!("Type error: {err:?}"); + continue; + } + }; let value = match Value::eval(&ctx, &expr) { Ok(value) => value, Err(err) => { @@ -72,7 +79,14 @@ fn main() -> rustyline::Result<()> { continue; } }; - println!("{value}"); + let typ = match value.typ() { + Ok(typ) => typ, + Err(err) => { + println!("Post-eval type error: {err:?}. This should not happen."); + continue; + } + }; + println!("{value}: {typ}"); } Ok(()) diff --git a/crates/rebel-lang/examples/type-string.rs b/crates/rebel-lang/examples/type-string.rs deleted file mode 100644 index 8ade044..0000000 --- a/crates/rebel-lang/examples/type-string.rs +++ /dev/null @@ -1,84 +0,0 @@ -use std::{fmt::Debug, process, time::Instant}; - -use clap::Parser; - -use rebel_lang::{ - func::{Func, FuncType}, - scope::Context, - typing::{ArrayLen, Type, TypeFamily}, -}; -use rebel_parse::{recipe, tokenize}; - -#[derive(Clone, Debug, Parser)] -struct Opts { - input: String, -} - -fn main() { - let opts: Opts = Opts::parse(); - let input = opts.input.trim(); - - let start = Instant::now(); - let result = tokenize::token_stream(input); - let dur = Instant::now().duration_since(start); - println!("Tokenization took {} µs", dur.as_micros()); - - let tokens = match result { - Ok(value) => value, - Err(err) => { - println!("{err}"); - process::exit(1); - } - }; - - let start = Instant::now(); - let result = recipe::expr(&tokens); - let dur = Instant::now().duration_since(start); - println!("Parsing took {} µs", dur.as_micros()); - - let expr = match result { - Ok(value) => value, - Err(err) => { - println!("{err}"); - process::exit(1); - } - }; - - let mut ctx = Context::default(); - - ctx.methods.entry(TypeFamily::Array).or_default().insert( - "len", - Func { - typ: FuncType { - params: vec![Type::Array(Box::new(Type::Free), ArrayLen::Dynamic)], - ret: Type::Int, - }, - def: None, - }, - ); - ctx.methods.entry(TypeFamily::Str).or_default().insert( - "len", - Func { - typ: FuncType { - params: vec![Type::Str], - ret: Type::Int, - }, - def: None, - }, - ); - - let start = Instant::now(); - let result = Type::ast_expr_type(&ctx, &expr); - let dur = Instant::now().duration_since(start); - println!("Typing took {} µs", dur.as_micros()); - - let typ = match result { - Ok(value) => value, - Err(err) => { - println!("{err:?}"); - process::exit(1); - } - }; - - println!("{typ}"); -} -- cgit v1.2.3