#![feature(box_syntax, box_patterns, fn_traits, nll, iterator_step_by)]
#![allow(unused_macros, unused_imports)]
#[macro_use]
extern crate nom;
extern crate cactus;
extern crate colored;
mod ast;
mod eval;
#[macro_use]
mod macros;
use colored::*;
use ast::*;
use types::Value;
const DASHES: &'static str = "--------------------------------";
fn main() {
println!("{}", DASHES);
run_program!(br#"(if
false (print "oh boy no no no")
true (print "wow it works")
(print "heckin darn"))"#);
run_program!(br#"(do
(print "print 1")
(print "print 2")
(plus 1 1)
(plus 2 2)
)"#);
run_program!(br#"(do
(let a 1)
(print "printing a")
(print a)
(func hello (arg1 arg2) (do
(print "hello functions!")
))
(do (do (do (hello 1 2))))
(do (do (do (hello 1 2))))
)"#);
}
mod tests {
use super::ast::*;
use super::eval;
use super::ast::types::Value::*;
lisp_tests! {
addition_pos: (b"(plus 1 1)", Number(2 as f32)),
if_1st: (br#"(if true 1 false 2 3)"#, Number(1 as f32)),
if_2nd: (br#"(if false 1 true 2 3)"#, Number(2 as f32)),
if_else: (br#"(if false 1 false 2 3)"#, Number(3 as f32)),
}
}