make a Visitable module
FossilOrigin-Name: 3ffc71c707c994c44a9f33025ed50ab91d2a7e60be6c639b6ed28798d82728a2
change twzsvlqswykuwqkqqyzrvxzwpxywqnmy
commit b3d364b39d75500362c7f421d2acba5e3252389c
author alpha <alpha@kejadlen.dev>
date
parent rqnlyquz
diff --git a/ruby/lib/lox/expr.rb b/ruby/lib/lox/expr.rb
index 38860a2..99bfbd1 100644
--- a/ruby/lib/lox/expr.rb
+++ b/ruby/lib/lox/expr.rb
@@ -1,19 +1,26 @@
 module Lox
   module Expr
+    module Visitable
+      def accept(visitor)
+        klass = self.class.to_s.split("::").last.downcase
+        visitor.send("visit_#{klass}", self)
+      end
+    end
+
     Binary = Struct.new(:left, :op, :right) do
-      def accept(visitor) = visitor.visit_binary(self)
+      include Visitable
     end
 
     Grouping = Struct.new(:expr) do
-      def accept(visitor) = visitor.visit_grouping(self)
+      include Visitable
     end
 
     Literal = Struct.new(:value) do
-      def accept(visitor) = visitor.visit_literal(self)
+      include Visitable
     end
 
     Unary = Struct.new(:op, :right) do
-      def accept(visitor) = visitor.visit_unary(self)
+      include Visitable
     end
   end
 end