summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-27 23:00:15 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-28 10:02:05 +0200
commitd9bda8ed4ff50ee82608e48a6ab8cdd5680b668c (patch)
treefa697b4714c807a0e4e8f1d858190742ea0e87fe /crates
parentb93a4d37ddb2d955ad4e4ba47020fd2b60551f42 (diff)
downloadrebel-d9bda8ed4ff50ee82608e48a6ab8cdd5680b668c.tar
rebel-d9bda8ed4ff50ee82608e48a6ab8cdd5680b668c.zip
rebel-lang: add type checking to REPL
Diffstat (limited to 'crates')
-rw-r--r--crates/rebel-lang/examples/repl.rs16
-rw-r--r--crates/rebel-lang/examples/type-string.rs84
2 files changed, 15 insertions, 85 deletions
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}");
-}