Beispiel #1
0
	"should perform basic num ops": function () {
		assert.evalEqual("(+ 2 3 2)", 7);
    assert.evalEqual("(- 5 3)", 2);
	},
Beispiel #2
0
 "should be able to name lets": function () {
   // while depends on named lets
   assert.evalEqual("(define a 5) (while (> a 0) (set! a (dec a))) a", 0);
 }
Beispiel #3
0
 "should be able to define functions": function () {
   assert.evalEqual("(define (fn x) (* x x)) (fn 5)", 25);
 },
Beispiel #4
0
 "should implement let": function () {
   assert.evalEqual("(let ((x 1)) x)", 1);
   assert.evalEqual("(define x 2) (let ((x 1)) x)", 1);
 },
Beispiel #5
0
 "should implement begin": function () {
   assert.evalEqual("(begin 1 2 3)", 3);
 },
Beispiel #6
0
  "should correctly handle if/and/or": function () {
    assert.evalEqual("(if #t 5 3)", 5);
    // lazy eval
    assert.evalEqual("(if #t 5 (/ 3 \"hello\"))", 5);
    assert.evalThrows("(if #t (/ 3 \"hello\") 5)");

    assert.evalEqual("(and #t #t)", true);
    assert.evalEqual("(and #t #f)", false);
    assert.evalEqual("(and #f #t)", false);
    assert.evalEqual("(and #f #f)", false);
    assert.evalEqual("(and #f (/ 3 \"hello\"))", false);
    assert.evalThrows("(and #t (/ 3 \"hello\"))");

    assert.evalEqual("(or #t #t)", true);
    assert.evalEqual("(or #t #f)", true);
    assert.evalEqual("(or #f #t)", true);
    assert.evalEqual("(or #f #f)", false);
    assert.evalEqual("(or #t (/ 3 \"hello\"))", true);
    assert.evalThrows("(or #f (/ 3 \"hello\"))");
  },