Browse Source

Use env in interpreter

master
Dylan Baker 5 years ago
parent
commit
df383987bf
3 changed files with 19 additions and 4 deletions
  1. 3
    3
      lib/chervil/interpreter.rb
  2. 0
    1
      lib/chervil/parser.rb
  3. 16
    0
      spec/interpreter_spec.rb

+ 3
- 3
lib/chervil/interpreter.rb View File

@@ -1,12 +1,12 @@
1 1
 module Chervil
2 2
   class Interpreter
3
-    def initialize(tree)
3
+    def initialize(tree, env = Env.new)
4 4
       @tree = tree
5
+      @env = env
5 6
     end
6 7
 
7 8
     def interpret
8
-      env = Env.new
9
-      @tree.map { |node| node.evaluate(env) }
9
+      @tree.map { |node| node.evaluate(@env) }
10 10
     end
11 11
   end
12 12
 end

+ 0
- 1
lib/chervil/parser.rb View File

@@ -29,7 +29,6 @@ module Chervil
29 29
         eat(:identifier)
30 30
         name = identifier
31 31
         value = expr
32
-        p @current_token
33 32
         eat(:rparen)
34 33
         return AST::Definition.new(name, value)
35 34
       end

+ 16
- 0
spec/interpreter_spec.rb View File

@@ -0,0 +1,16 @@
1
+module Chervil
2
+  RSpec.describe Interpreter do
3
+    def interpret(source, env)
4
+      lexer = Lexer.new(source)
5
+      tree = Parser.new(lexer).parse
6
+      Interpreter.new(tree, env).interpret
7
+    end
8
+
9
+    it 'interprets a definition and variable usage' do
10
+      env = Env.new
11
+      interpret('(define x 5)', env)
12
+      expect(env.get("x")).to eq(AST::Number.new(5.0))
13
+      expect(interpret('x', env).first).to eq(AST::Number.new(5.0))
14
+    end
15
+  end
16
+end

Loading…
Cancel
Save