Parcourir la source

Evaluate conditionals

master
Dylan Baker il y a 6 ans
Parent
révision
fc7978ce6b
2 fichiers modifiés avec 21 ajouts et 0 suppressions
  1. 8
    0
      src/evaluator.js
  2. 13
    0
      test/evaluatorTest.js

+ 8
- 0
src/evaluator.js Voir le fichier

@@ -31,6 +31,14 @@ module.exports = class Evaluator {
31 31
       case AST.Definition:
32 32
         this.env.set(node.symbol.name, node.value)
33 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 42
       case AST.Application:
35 43
         switch (node.function.constructor) {
36 44
           case AST.Identifier:

+ 13
- 0
test/evaluatorTest.js Voir le fichier

@@ -27,3 +27,16 @@ test('define', t => {
27 27
   tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)')
28 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
+})

Chargement…
Annuler
Enregistrer