Files
lispers/src/bin/lisp_demo.rs

42 lines
1.4 KiB
Rust

use lispers_core::lisp::{eval, Environment};
use lispers_core::parser::ExpressionStream;
fn main() {
let programs = [
"((lambda (x y) (+ (if (< x 10) (* x 11) x) y)) 2 20)",
"(set 'myvar \"hello world!\")",
"(print myvar) (print 'myvar)",
"(car (cons 'a 'b)) (cdr (cons 'c 'd)) (cons 'a 'b)",
"(eval (car (cons 'myvar 'b)))",
"(set 'pow (lambda (a b) (if (= b 0) 1 (* a (pow a (- b 1))))))",
"pow",
"(pow 2 10)",
"(let '((fib . (lambda (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))))) (fib 10))",
"(defun do-n-times (f n) (if (= n 0) '() (cons (f) (do-n-times f (- n 1)))))",
"(do-n-times (lambda () (print 'hello)) 5)",
"(progn (print 'hello) (print 'world))",
"(load \"(defun loaded-foo (x) (+ x 1))\")",
"(loaded-foo 1)",
];
let environment = Environment::default();
for r in ExpressionStream::from_char_stream(programs.iter().map(|p| p.chars()).flatten()) {
match r {
Err(err) => {
println!("ParserError: {:?}", err);
break;
}
Ok(expr) => {
println!("Evaluating: {}", expr.clone());
match eval(&environment, expr) {
Ok(e) => println!("=> {}", e),
Err(e) => println!("Error: {}", e),
}
}
}
}
println!("Interpreter Done!");
}