rename meta to singleton class

seems more appropriate, as it is the class for a single object
Also seems to be called that on the net (don't remember where the meta came from, but it's gone)
This commit is contained in:
Torsten Rüger 2019-09-23 20:57:33 +03:00
parent 66728f09f4
commit a446d3da6b
12 changed files with 33 additions and 33 deletions

View File

@ -9,7 +9,7 @@ require_relative "parfait/integer"
require_relative "parfait/factory" require_relative "parfait/factory"
require_relative "parfait/behaviour" require_relative "parfait/behaviour"
require_relative "parfait/class" require_relative "parfait/class"
require_relative "parfait/meta_class" require_relative "parfait/singleton_class"
require_relative "parfait/list" require_relative "parfait/list"
require_relative "parfait/word" require_relative "parfait/word"
require_relative "parfait/binary_code" require_relative "parfait/binary_code"

View File

@ -1,12 +1,12 @@
module Parfait module Parfait
# Behaviour is the old smalltalk name for the duperclass of class and meta_class # Behaviour is the old smalltalk name for the duperclass of class and singleton_class
# #
# Classes and meta_classes are in fact very similar, in that they manage # Classes and singleton_classes are in fact very similar, in that they manage
# - the type of instances # - the type of instances
# - the methods for instances # - the methods for instances
# #
# The main way they differ is that Classes manage type for a class of objects (ie many) # The main way they differ is that Classes manage type for a class of objects (ie many)
# whereas meta_class, or singleton_class manages the type of only one object (here a class) # whereas singleton_class, or singleton_class manages the type of only one object (here a class)
# #
# Singleton classes can manage the type/methods of any single object, and in the # Singleton classes can manage the type/methods of any single object, and in the
# future off course they will, just not yet. Most single objects don't need that, # future off course they will, just not yet. Most single objects don't need that,

View File

@ -17,7 +17,7 @@
module Parfait module Parfait
class Class < Behaviour class Class < Behaviour
attr_reader :name , :super_class_name , :meta_class attr_reader :name , :super_class_name , :singleton_class
def self.type_length def self.type_length
6 6
@ -30,7 +30,7 @@ module Parfait
super(instance_type) super(instance_type)
@name = name @name = name
@super_class_name = superclass @super_class_name = superclass
@meta_class = MetaClass.new( self , self.type || @name) @singleton_class = SingletonClass.new( self , self.type || @name)
end end
def rxf_reference_name def rxf_reference_name

View File

@ -1,20 +1,20 @@
# #
# In many respects a MetaClass is like a Class. We haven't gone to the full ruby/oo level # In many respects a SingletonClass is like a Class. We haven't gone to the full ruby/oo level
# yet, where the metaclass is actually a class instance, but someday. # yet, where the singleton_class is actually a class instance, but someday.
# A Class in general can be viewed as a way to generate methods for a group of objects. # A Class in general can be viewed as a way to generate methods for a group of objects.
# A MetaClass serves the same function, but just for one object, the class object that it # A SingletonClass serves the same function, but just for one object, the class object that it
# is the meta_class of. # is the singleton_class of.
# This is slightly different in the way that the type of the class must actually # This is slightly different in the way that the type of the class must actually
# change, whereas for a class the instance type changes and only objects generated # change, whereas for a class the instance type changes and only objects generated
# henceafter have a different type. # henceafter have a different type.
# Another current difference is that a metaclass has no superclass. Also no name. # Another current difference is that a singleton_class has no superclass. Also no name.
# There is a one to one relationship between a class instance and it's meta_class instance. # There is a one to one relationship between a class instance and it's singleton_class instance.
module Parfait module Parfait
class MetaClass < Behaviour class SingletonClass < Behaviour
attr_reader :clazz attr_reader :clazz
@ -36,7 +36,7 @@ module Parfait
end end
def inspect def inspect
"MetaClass(#{@clazz.name})" "SingletonClass(#{@clazz.name})"
end end
def to_s def to_s

View File

@ -51,7 +51,7 @@ module Parfait
classes.each do |name , cl| classes.each do |name , cl|
object_type = Parfait.object_space.get_type_by_class_name(name) object_type = Parfait.object_space.get_type_by_class_name(name)
raise "nil type" unless object_type raise "nil type" unless object_type
cl.meta_class.instance_eval{ @instance_type = class_type} cl.singleton_class.instance_eval{ @instance_type = class_type}
cl.instance_eval{ @instance_type = object_type} cl.instance_eval{ @instance_type = object_type}
cl.instance_eval{ @super_class_name = super_names[name] || :Object} cl.instance_eval{ @super_class_name = super_names[name] || :Object}
object_type.instance_eval{ @object_class = cl } object_type.instance_eval{ @object_class = cl }
@ -85,7 +85,7 @@ module Parfait
CallableMethod: :Callable, CallableMethod: :Callable,
Block: :Callable, Block: :Callable,
Class: :Behaviour, Class: :Behaviour,
MetaClass: :Behaviour , SingletonClass: :Behaviour ,
ReturnAddress: :Integer} ReturnAddress: :Integer}
end end
@ -106,7 +106,7 @@ module Parfait
arguments_type: :Type , self_type: :Type, frame_type: :Type , arguments_type: :Type , self_type: :Type, frame_type: :Type ,
name: :Word , blocks: :Block} , name: :Word , blocks: :Block} ,
Class: {instance_methods: :List, instance_type: :Type, Class: {instance_methods: :List, instance_type: :Type,
name: :Word, super_class_name: :Word , meta_class: :MetaClass}, name: :Word, super_class_name: :Word , singleton_class: :SingletonClass},
DataObject: {}, DataObject: {},
Data4: {}, Data4: {},
Data8: {}, Data8: {},
@ -129,7 +129,7 @@ module Parfait
local5: :Object, local6: :Object ,local7: :Object, local8: :Object , local5: :Object, local6: :Object ,local7: :Object, local8: :Object ,
local9: :Object ,local10: :Object, local11: :Object , local12: :Object, local9: :Object ,local10: :Object, local11: :Object , local12: :Object,
local13: :Object, local14: :Object, local15: :Object}, local13: :Object, local14: :Object, local15: :Object},
MetaClass: {instance_methods: :List, instance_type: :Type, clazz: :Class }, SingletonClass: {instance_methods: :List, instance_type: :Type, clazz: :Class },
NilClass: {}, NilClass: {},
Object: {}, Object: {},
ReturnAddress: {next_integer: :ReturnAddress}, ReturnAddress: {next_integer: :ReturnAddress},

View File

@ -37,7 +37,7 @@ module Vool
when MethodExpression when MethodExpression
node.to_mom(@clazz) node.to_mom(@clazz)
when ClassMethodExpression when ClassMethodExpression
node.to_mom(@clazz.meta_class) node.to_mom(@clazz.singleton_class)
else else
raise "Only methods for now #{node.class}:#{node}" raise "Only methods for now #{node.class}:#{node}"
end end
@ -62,7 +62,7 @@ module Vool
end end
# goes through the code looking for instance variables (and their assignments) # goes through the code looking for instance variables (and their assignments)
# adding each to the respective type, ie class or meta_class, depending # adding each to the respective type, ie class or singleton_class, depending
# on if they are instance or class instance variables. # on if they are instance or class instance variables.
# #
# Class variables are deemed a design mistake, ie not implemented (yet) # Class variables are deemed a design mistake, ie not implemented (yet)
@ -72,7 +72,7 @@ module Vool
when MethodExpression when MethodExpression
target = @clazz target = @clazz
when ClassMethodExpression when ClassMethodExpression
target = @clazz.meta_class target = @clazz.singleton_class
else else
raise "Only methods for now #{node.class}:#{node}" raise "Only methods for now #{node.class}:#{node}"
end end

View File

@ -8,7 +8,7 @@ module Vool
end end
def to_mom(clazz) def to_mom(clazz)
raise "not meta" unless clazz.class == Parfait::MetaClass raise "not singleton" unless clazz.class == Parfait::SingletonClass
raise( "no class in #{self}") unless clazz raise( "no class in #{self}") unless clazz
method = clazz.add_instance_method_for(name , make_arg_type , make_frame , body ) method = clazz.add_instance_method_for(name , make_arg_type , make_frame , body )
#puts "CLass method Class:#{clazz}:#{name}" #puts "CLass method Class:#{clazz}:#{name}"

View File

@ -49,7 +49,7 @@ module Vool
class ModuleName < Expression class ModuleName < Expression
include Named include Named
def ct_type def ct_type
get_named_class.meta_class.instance_type get_named_class.singleton_class.instance_type
end end
def to_slot(_) def to_slot(_)
return Mom::SlotDefinition.new( get_named_class, []) return Mom::SlotDefinition.new( get_named_class, [])

View File

@ -1,11 +1,11 @@
require_relative "helper" require_relative "helper"
module Parfait module Parfait
class TestMetaClass < ParfaitTest class TestSingletonClass < ParfaitTest
def setup def setup
super super
@try = @space.create_class( :Try , :Object).meta_class @try = @space.create_class( :Try , :Object).singleton_class
end end
def test_type_forclass def test_type_forclass
@ -17,7 +17,7 @@ module Parfait
end end
def test_new_superclass def test_new_superclass
assert_equal "Class(Try)" , @try.clazz.inspect assert_equal "Class(Try)" , @try.clazz.inspect
assert_equal "MetaClass(Try)" , @try.inspect assert_equal "SingletonClass(Try)" , @try.inspect
end end
def test_new_methods def test_new_methods
assert_equal @try.method_names.class, @try.instance_methods.class assert_equal @try.method_names.class, @try.instance_methods.class

View File

@ -6,7 +6,7 @@ module Parfait
def classes def classes
[:Behaviour ,:BinaryCode,:Block,:CacheEntry,:Callable,:CallableMethod,:Class, [:Behaviour ,:BinaryCode,:Block,:CacheEntry,:Callable,:CallableMethod,:Class,
:DataObject,:Data4,:Data8,:Data16,:Data32,:Dictionary,:Factory, :Integer,:FalseClass, :DataObject,:Data4,:Data8,:Data16,:Data32,:Dictionary,:Factory, :Integer,:FalseClass,
:List,:Message, :MetaClass,:NilClass,:Object,:ReturnAddress, :List,:Message, :SingletonClass,:NilClass,:Object,:ReturnAddress,
:Space,:TrueClass,:Type,:VoolMethod,:Word] :Space,:TrueClass,:Type,:VoolMethod,:Word]
end end
@ -27,8 +27,8 @@ module Parfait
def test_get_class_by_name def test_get_class_by_name
assert_equal Parfait::Class , space_class.class assert_equal Parfait::Class , space_class.class
end end
def test_get_meta_class def test_get_singleton_class
assert_equal Parfait::MetaClass , space_class.meta_class.class assert_equal Parfait::SingletonClass , space_class.singleton_class.class
end end
def test_get_type_by_class_name def test_get_type_by_class_name
assert_equal Parfait::Type , Parfait.object_space.get_type_by_class_name(:Space).class assert_equal Parfait::Type , Parfait.object_space.get_type_by_class_name(:Space).class
@ -72,9 +72,9 @@ module Parfait
end end
end end
end end
def test_all_meta def test_all_singletons
@space.classes.each do |name , clazz| @space.classes.each do |name , clazz|
assert clazz.meta_class , clazz.name assert clazz.singleton_class , clazz.name
end end
end end
def test_has_factory def test_has_factory

View File

@ -19,7 +19,7 @@ module Risc
MAIN MAIN
super super
end end
#Space type is wrong, shold be same as meta_class.instance_type #Space type is wrong, shold be same as singleton_class.instance_type
def test_chain def test_chain
#show_main_ticks # get output of what is #show_main_ticks # get output of what is
run_input @string_input run_input @string_input

View File

@ -27,7 +27,7 @@ module Vool
def test_class_inst def test_class_inst
space_class = Parfait.object_space.get_class space_class = Parfait.object_space.get_class
assert_equal :Space , space_class.name assert_equal :Space , space_class.name
names = space_class.meta_class.instance_type.names names = space_class.singleton_class.instance_type.names
assert names.index_of(:inst) , names assert names.index_of(:inst) , names
end end
def test_compiler def test_compiler