[Repost] 3.10 traits inconsistencies

Andreas Raab andreas.raab at gmx.de
Wed Nov 28 06:17:55 UTC 2007


Hi -

[Repost from a while ago. I'm still interested in finding out more about 
these issues - who maintains traits these days?]

I noticed some traits inconsistencies in the latest 3.10 beta. If
someone could shed a light on those, I'd appreciate it:

* Class definitions with traits:

Class>>subclass: t uses: aTraitCompositionOrArray instanceVariableNames:
f classVariableNames: d poolDictionaries: s category: cat

says this:

   copyOfOldClass := self copy.
   newClass := self subclass: t instanceVariableNames: f
classVariableNames: d poolDictionaries: s category: cat.
   "..."
   SystemChangeNotifier uniqueInstance
	classDefinitionChangedFrom: copyOfOldClass to: newClass.

This seems wrong because unless I'm missing something the
"copyOfOldClass" is the superclass of the class being changed and not
its old representation. This pattern seems to appear in all traits
subclass creation methods.

* Class traits:

fooTrait := Trait named: #TFooTrait uses:{} category: 'Tests'.
barTrait := Trait named: #TBarTrait uses:{} category: 'Tests'.

classA := Object subclass: #TestClassA
   uses: fooTrait
   instanceVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   category: 'Tests'.
classA classTrait uses: fooTrait class + barTrait. "works"

classB := Object subclass: #TestClassB
   uses: fooTrait + barTrait
   instanceVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   category: 'Tests'.
classA classTrait uses: fooTrait class + barTrait. "fails"

Why is this? In particular considering that we can transform classA into
the desired shape via:

classA := Object subclass: #TestClassA
   uses: fooTrait
   instanceVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   category: 'Tests'.
classA classTrait uses: fooTrait class + barTrait. "works"
classA := Object subclass: #TestClassA
   uses: fooTrait + barTrait
   instanceVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   category: 'Tests'.

(note that in the above the obvious desire is to include the methods of
TFooTrait for both class and metaclass operations). Given that the
former doesn't work, I think this last example constitutes a bug. But
more importantly: What the rationale for disallowing the inclusion of
the same trait on both instance and class side?

* Fileouts:

I was trying to file out a bunch of code with traits and found that I
can't file it in again. I've tried with other code and, for example,
Nile can't be filed out and back in either (if you need something to try
it with). Monticello seems to work but at times this is a bit of a
heavy-weight solution. Any ideas?

Oh, and lastly: Is there any documentation at all about the the
implementation of the traits kernel? (not the general approach; I'm
pretty clear on that but rather on the implementation itself) I seem to
remember having seen references to a thesis maybe but I can't remember.
Any pointers welcome.

Cheers,
   - Andreas




More information about the Squeak-dev mailing list