From 1b813e39fb205d800bc91861664654a190e85da4 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Fri, 10 Feb 2023 23:05:08 -0500 Subject: [PATCH] Fix vapply bug, write vmap, add debug --- kr/src/main.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/kr/src/main.rs b/kr/src/main.rs index 6ff102c..286b1ae 100644 --- a/kr/src/main.rs +++ b/kr/src/main.rs @@ -94,10 +94,11 @@ fn parse_test() { {} !(let1 vapply (vau de p !(let1 f (eval (car p) de)) - !(let1 p (eval (car (cdr p)) de)) + !(let1 ip (eval (car (cdr p)) de)) !(let1 nde (eval (car (cdr (cdr p))) de)) - (eval (cons f p) nde) + (eval (cons f ip) nde) ))", LET); + let BADID = format!(" {} !(let1 badid (vau de p @@ -115,6 +116,20 @@ fn parse_test() { // and the Rc::drop will overflow the stack lol eval_test(&g, &e, &format!("{} (badid 1000)", BADID), 1000); + let VMAP = format!(" + {} + !(let1 vmap (vau de p + !(let1 vmap_inner (vau ide ip + !(let1 self (car ip)) + !(let1 f (car (cdr ip))) + !(let1 l (car (cdr (cdr ip)))) + !(if (= nil l) l) + (cons (vapply f (cons (car l) nil) de) (vapply self (cons self (cons f (cons (cdr l) nil))) de)) + )) + (vapply vmap_inner (cons vmap_inner (cons (eval (car p) de) (cons (eval (car (cdr p)) de) nil))) de) + ))", VAPPLY); + eval_test(&g, &e, &format!("{} (vmap (vau de p (+ 1 (car p))) '(1 2 3))", VMAP), (2, (3, (4, Form::Nil)))); + // TODO, finish lambda let LAMBDA = " ((vau root_env _ (eval '((lambda x 2)) @@ -238,6 +253,11 @@ fn root_env() -> Rc
{ PossibleTailCall::Result(p.car().unwrap()) }))), + ("debug", Rc::new(Form::PrimComb("debug".to_owned(), |e, p| { + println!("Debug: {:?}", eval(Rc::clone(&e), p.car().unwrap())); + PossibleTailCall::TailCall(e, p.cdr().unwrap().car().unwrap()) + }))), + ("+", Rc::new(Form::PrimComb("+".to_owned(), |e, p| { let a = eval(Rc::clone(&e), p.car().unwrap()).int().unwrap(); let b = eval(e, p.cdr().unwrap().car().unwrap()).int().unwrap();