rudus/src/main.rs

89 lines
2.4 KiB
Rust
Raw Normal View History

2024-10-29 03:59:50 +00:00
// an implementation of Ludus
// curently left undone (and not adding for a while yet):
// * sets
// * interpolated strings & string patterns
// * pkgs, namespaces, imports, `use` forms
// * with forms
// * test forms
// * ignored words
// todo:
// * [x] rewrite fn parser to use chumsky::Recursive::declare/define
// - [x] do this to extract/simplify/DRY things like tuple patterns, fn clauses, etc.
2024-10-31 19:38:55 +00:00
// * [x] Work around chumsky::Stream::from_iter().spanned disappearing in most recent version
2024-10-29 03:59:50 +00:00
// * [x] investigate using labels (which is behind a compiler flag, somehow)
2024-11-21 21:41:46 +00:00
// * [ ] write parsing errors
2024-10-29 03:59:50 +00:00
// * [ ] wire up Ariadne parsing errors
2024-11-21 21:41:46 +00:00
// * [ ] add stack traces and code locations to panics
2024-10-29 03:59:50 +00:00
// * [ ] validation
2024-10-31 20:59:26 +00:00
// * [x] break this out into multiple files
// * [x] write a tree-walk VM
// - [x] learn how to deal with lifetimes
// - [x] with stack mechanics and refcounting
// - [ ] with tail-call optimization (nb: this may not be possible w/ a TW-VM)
// - [ ] with all the necessary forms for current Ludus
2024-11-21 01:10:17 +00:00
// * [x] guards in match clauses
2024-11-15 03:19:52 +00:00
// * [x] `as` patterns
2024-11-21 01:10:17 +00:00
// * [x] splat patterns in tuples, lists, dicts
2024-11-21 21:41:46 +00:00
// * [x] splats in list and dict literals
2024-11-21 22:02:54 +00:00
// * [x] `loop` and `recur`
2024-11-15 03:19:52 +00:00
// * [ ] string patterns
// * [ ] string interpolation
2024-11-15 02:30:42 +00:00
// * [~] write `base` in Rust
2024-10-29 03:59:50 +00:00
// * [ ] turn this into a library function
// * [ ] compile this into WASM
// * [ ] perf testing
2024-10-31 20:59:26 +00:00
use chumsky::{input::Stream, prelude::*};
2024-11-21 22:10:50 +00:00
// use std::rc::Rc;
2024-10-29 03:59:50 +00:00
2024-10-31 20:59:26 +00:00
mod spans;
2024-10-29 03:59:50 +00:00
2024-10-31 20:59:26 +00:00
mod lexer;
use crate::lexer::*;
2024-10-29 03:59:50 +00:00
2024-10-31 20:59:26 +00:00
mod value;
2024-11-21 22:10:50 +00:00
// use crate::value::*;
2024-10-29 03:59:50 +00:00
2024-10-31 20:59:26 +00:00
mod parser;
use crate::parser::*;
2024-10-29 03:59:50 +00:00
mod vm;
use crate::vm::*;
mod base;
use crate::base::*;
2024-10-29 03:59:50 +00:00
pub fn main() {
2024-11-11 01:12:19 +00:00
let src = "
2024-11-21 22:02:54 +00:00
let foo = false
2024-11-21 21:41:46 +00:00
loop (foo) with {
(:foo) -> :done
2024-11-21 22:02:54 +00:00
(x as :boolean) -> recur (:bar)
2024-11-21 21:41:46 +00:00
(x as :number) -> recur (:foo)
(x as :keyword) -> recur (:foo)
2024-11-21 01:10:17 +00:00
}
2024-11-11 01:12:19 +00:00
";
2024-10-29 03:59:50 +00:00
let (tokens, lex_errs) = lexer().parse(src).into_output_errors();
if lex_errs.len() > 0 {
println!("{:?}", lex_errs);
return ();
}
let tokens = tokens.unwrap();
let to_parse = tokens.clone();
2024-11-11 01:12:19 +00:00
// for (token, _) in tokens {
// println!("{}", token)
// }
2024-10-29 03:59:50 +00:00
let (ast, _) = parser()
2024-10-31 19:38:55 +00:00
.parse(Stream::from_iter(to_parse).map((0..src.len()).into(), |(t, s)| (t, s)))
2024-10-29 03:59:50 +00:00
.unwrap();
2024-11-11 01:12:19 +00:00
// println!("{}", ast);
let mut ctx = base();
2024-11-06 22:37:57 +00:00
let result = eval(&ast, &mut ctx).unwrap();
println!("{}", result);
2024-10-29 03:59:50 +00:00
}