12.3
change plqlytxszkrtksorqyzsmmmlkkkonzsp
commit f4826b8433c2f275d84f1a8b00b3ac1f92dea99c
author Alpha Chen <alpha@kejadlen.dev>
date
parent ykrzkxlz
diff --git a/ruby/lib/lox/instance.rb b/ruby/lib/lox/instance.rb
new file mode 100644
index 0000000..0b74998
--- /dev/null
+++ b/ruby/lib/lox/instance.rb
@@ -0,0 +1,11 @@
+module Lox
+  class Instance
+
+    def initialize(klass)
+      @klass = klass
+    end
+
+    def to_s = "#{@klass.name} instance"
+
+  end
+end
diff --git a/ruby/lib/lox/interpreter.rb b/ruby/lib/lox/interpreter.rb
index 79bea5e..e0ad8aa 100644
--- a/ruby/lib/lox/interpreter.rb
+++ b/ruby/lib/lox/interpreter.rb
@@ -1,5 +1,6 @@
 require_relative "environment"
 require_relative "function"
+require_relative "lox_class"
 
 module Lox
   class Interpreter
@@ -43,6 +44,13 @@ module Lox
       nil
     end
 
+    def visit_class(stmt)
+      @env.define(stmt.name.lexeme, nil)
+      klass = LoxClass.new(stmt.name.lexeme)
+      @env.assign(stmt.name, klass)
+      nil
+    end
+
     def execute_block(stmts, env)
       prev_env = @env
       @env = env
diff --git a/ruby/lib/lox/resolver.rb b/ruby/lib/lox/resolver.rb
index ac5aa27..224ceb5 100644
--- a/ruby/lib/lox/resolver.rb
+++ b/ruby/lib/lox/resolver.rb
@@ -24,6 +24,12 @@ module Lox
       nil
     end
 
+    def visit_class(stmt)
+      declare(stmt.name)
+      define(stmt.name)
+      nil
+    end
+
     def visit_expr(stmt) = resolve(stmt.expr)
 
     def visit_function(stmt)
diff --git a/ruby/test/lox/test_interpreter.rb b/ruby/test/lox/test_interpreter.rb
index f2cfcf3..9abf291 100644
--- a/ruby/test/lox/test_interpreter.rb
+++ b/ruby/test/lox/test_interpreter.rb
@@ -306,6 +306,36 @@ class TestInterpreter < Lox::Test
     SRC
   end
 
+  def test_class
+    assert_interpreted "", <<~SRC
+      class Breakfast {
+        cook() {
+          print "Eggs a-fryin'!";
+        }
+
+        serve(who) {
+          print "Enjoy your breakfast, " + who + ".";
+        }
+      }
+    SRC
+
+    assert_interpreted "DevonshireCream", <<~SRC
+      class DevonshireCream {
+        serveOn() {
+          return "Scones";
+        }
+      }
+
+      print DevonshireCream; // Prints "DevonshireCream".
+    SRC
+
+    assert_interpreted "Bagel instance", <<~SRC
+      class Bagel {}
+      var bagel = Bagel();
+      print bagel; // Prints "Bagel instance".
+    SRC
+  end
+
   private
 
   def assert_interpreted(expected, src)