Browse Source

Evaluate conditionals

master
Dylan Baker 5 years ago
parent
commit
1a9bdbfc52
2 changed files with 63 additions and 0 deletions
  1. 8
    0
      lib/chervil/ast/conditional.rb
  2. 55
    0
      spec/ast/conditional_spec.rb

+ 8
- 0
lib/chervil/ast/conditional.rb View File

@@ -13,5 +13,13 @@ module Chervil::AST
13 13
     def ==(other)
14 14
       @predicate == other.predicate && @true_branch == other.true_branch && @false_branch == other.false_branch
15 15
     end
16
+
17
+    def evaluate(env)
18
+      if @predicate.evaluate(env) == false
19
+        @false_branch.evaluate(env)
20
+      else
21
+        @true_branch.evaluate(env)
22
+      end
23
+    end
16 24
   end
17 25
 end

+ 55
- 0
spec/ast/conditional_spec.rb View File

@@ -0,0 +1,55 @@
1
+module Chervil
2
+  RSpec.describe AST::Conditional do
3
+    it 'returns the true branch given #t' do
4
+      expect(AST::Conditional.new(
5
+        AST::Boolean.new(true),
6
+        AST::Number.new(1.0),
7
+        AST::Number.new(0.0),
8
+      ).evaluate(Env.new)).to eq(
9
+        1.0
10
+      )
11
+    end
12
+
13
+    it 'returns the false branch given #f' do
14
+      expect(AST::Conditional.new(
15
+        AST::Boolean.new(false),
16
+        AST::Number.new(1.0),
17
+        AST::Number.new(0.0),
18
+      ).evaluate(Env.new)).to eq(
19
+        0.0
20
+      )
21
+    end
22
+
23
+    it 'evaluates complex predicates' do
24
+      expect(AST::Conditional.new(
25
+        AST::Application.new(
26
+          AST::Identifier.new(">"),
27
+          [
28
+            AST::Number.new(2.0),
29
+            AST::Number.new(1.0),
30
+          ]
31
+        ),
32
+        AST::Number.new(2.0),
33
+        AST::Number.new(1.0),
34
+      ).evaluate(Env.new)).to eq(
35
+        2.0
36
+      )
37
+    end
38
+
39
+    it 'evaluates complex branches' do
40
+      expect(AST::Conditional.new(
41
+        AST::Boolean.new(true),
42
+        AST::Application.new(
43
+          AST::Identifier.new("+"),
44
+          [
45
+            AST::Number.new(2.0),
46
+            AST::Number.new(1.0),
47
+          ]
48
+        ),
49
+        AST::Number.new(0.0)
50
+      ).evaluate(Env.new)).to eq(
51
+        3.0
52
+      )
53
+    end
54
+  end
55
+end

Loading…
Cancel
Save