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:
parent
6993e337bf
commit
d901c6f27c
@ -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"
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
@ -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},
|
||||||
|
@ -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
|
||||||
|
@ -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}"
|
||||||
|
@ -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, [])
|
||||||
|
@ -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
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user