Browse Source

Evaluate conditionals

master
Dylan Baker 6 years ago
parent
commit
fc7978ce6b
2 changed files with 21 additions and 0 deletions
  1. 8
    0
      src/evaluator.js
  2. 13
    0
      test/evaluatorTest.js

+ 8
- 0
src/evaluator.js View File

31
       case AST.Definition:
31
       case AST.Definition:
32
         this.env.set(node.symbol.name, node.value)
32
         this.env.set(node.symbol.name, node.value)
33
         return false
33
         return false
34
+      case AST.Conditional:
35
+        let result = this.evalNode(node.condition, env)
36
+
37
+        if (result.constructor == AST.Boolean && result.value === true) {
38
+          return this.evalNode(node.ifCase, env)
39
+        }
40
+
41
+        return this.evalNode(node.elseCase, env)
34
       case AST.Application:
42
       case AST.Application:
35
         switch (node.function.constructor) {
43
         switch (node.function.constructor) {
36
           case AST.Identifier:
44
           case AST.Identifier:

+ 13
- 0
test/evaluatorTest.js View File

27
   tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)')
27
   tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)')
28
   t.deepEqual(tree[0], new AST.Number({ value: 6 }))
28
   t.deepEqual(tree[0], new AST.Number({ value: 6 }))
29
 })
29
 })
30
+
31
+test('conditionals', t => {
32
+  t.plan(3)
33
+
34
+  let tree = helpers.evaluate('(if #t 1 0)')
35
+  t.deepEqual(tree[0], new AST.Number({ value: 1 }))
36
+
37
+  tree = helpers.evaluate('(if #f 1 0)')
38
+  t.deepEqual(tree[0], new AST.Number({ value: 0 }))
39
+
40
+  tree = helpers.evaluate('(if (= (+ 4 9) (- 20 7)) (+ 10 9) (- 4 2))')
41
+  t.deepEqual(tree[0], new AST.Number({ value: 19 }))
42
+})

Loading…
Cancel
Save