Musings about modularity and programming in the large

itsme213 itsme213 at hotmail.com
Thu Jan 24 17:49:45 UTC 2008


"Ignacio Vivona" <altobarba at gmail.com> wrote in message 
news:7d92ea5d0801240640x1766cf19md17c3e5d58b5c208 at mail.gmail.com...
> why is not having metaclasses a nice feature?

It is about metaclasses not being "special" or hidden or singletons, but 
being just as user-accessible, definable, instantiable, and extensible as 
any other object (and class). It is a much simpler meta-structure than 
Smalltalk-80.

e.g. See 
http://www.iam.unibe.ch/~ducasse/Web/ArchivedLectures/p156-cointe.pdf.

NewSpeak seems to incorporate first-class namespaces and modules within this 
really clean and simple framework.

- Sophie

================
(If interested, here is a quote and a summary of that paper):

"This paper shows how an attempt at a uniform and reflective definition 
resulted in an open-ended system ... We propose to unify Smalltalk classes 
and their terminal instances. This unification allows us to treat a class as 
a "first class citizen", to give a circular definition to the first 
metaclass, to access to the metaclass level, and finally to control the 
instantiation link. Because each object is an instance of another one and 
because a metaclass is a real class inheriting from another one, the 
metaclss links can be created indefinitely."

Summary (all errors mine :-)
- Just 2 pre-defined classes: Object and Class
  - every object (including all classes) has instVars and behaviors
- Just 5 pre-defined instVars:
  All objects:
  - instanceOf: every object is instanceOf some class
  All classes:
  - name: name of class
  - supers: every class (except Object) has 1(+) super class
  - instanceVariables (of its instances)
    instanceMethods (method dictionary of its instances)
     - every class has these
     - these control instVars and behaviors of instances of that class
- Just 2 pre-defined behaviors:
  - #send:args: every object supports this
  - #basicNew: every class supports the #basicNew primitive
     - #basicNew on a metaclass produces another class
  - A terminal (i.e. non-class) object does not respond to #new
- Class is subclass of Object
  - so every class is an object
- Class is an instance of Class
  - so the instVars and behaviors of Class are defined by Class
  - Class is the initial primitive "metaclass"
- Object is an instance of Class

- Meta-stuff is now nothing special
  - "As a common object, a class is defined by its class
     and the values of its associated instances variables", no more
  - Any subclass (direct or indirect) of Class is a meta-class 






More information about the Squeak-dev mailing list