rudus/src/main.rs

88 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-22 03:36:57 +00:00
// * [x] docstrings
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-12-04 23:30:03 +00:00
\"{} {foobar}\"
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();
2024-11-21 23:50:13 +00:00
if !lex_errs.is_empty() {
2024-10-29 03:59:50 +00:00
println!("{:?}", lex_errs);
2024-11-21 23:50:13 +00:00
return;
2024-10-29 03:59:50 +00:00
}
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-12-04 23:30:03 +00:00
println!("{}", ast);
2024-12-04 23:30:03 +00:00
// let mut ctx = base();
2024-12-04 23:30:03 +00:00
// let result = eval(&ast, &mut ctx).unwrap();
2024-12-04 23:30:03 +00:00
// println!("{}", result);
2024-11-21 23:50:13 +00:00
// struct_scalpel::print_dissection_info::<value::Value>()
// struct_scalpel::print_dissection_info::<parser::Ast>();
// println!("{}", std::mem::size_of::<parser::Ast>())
2024-10-29 03:59:50 +00:00
}