rudus/src/main.rs

102 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)
// * [ ] wire up Ariadne parsing errors
// * [ ] 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
// * [ ] guards in match clauses
2024-11-15 03:19:52 +00:00
// * [x] `as` patterns
// * [ ] splat patterns in tuples, lists, dicts
// * [ ] splats in list and dict literals
// * [ ] `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::*};
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;
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-15 02:55:19 +00:00
fn fancy_add {
() -> 0
(n as :number) -> n
(x as :number, y as :number) -> add (x, y)
}
fn fancy_sub {
() -> 0
(n as :number) -> n
(x as :number, y as :number) -> sub (x, y)
}
fn fib {
(1) -> 1
(2) -> 1
(n) -> fancy_add(
fib (fancy_sub (n, 1))
fib (fancy_sub (n, 2))
)
}
2024-11-15 02:30:42 +00:00
2024-11-15 02:55:19 +00:00
fib (30)
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
}