I'd also put in the pot a more declarative, less-smalltalkish-syntax
approach:

Class {
  name: 'A',
  superclass: Object,
  a: InstVar,
  b: InstVar,
  c: InstVar
}

Of course this could evolve.

Some people will say that this is too verbose if you have lots of instance
variables. I'd say that having too many instance variables is a code smell
:)

Guille

On Mon, May 22, 2017 at 1:27 PM, Gabriel Cotelli <[email protected]>
wrote:

> If we can get rid off the myriad of class creation methods count me in. :)
>
> I would do something like:
>
>  ClassBuilder new
>   name: #A;
>   superclass: Object;
>   addInstanceVariableNamed: 'a';
>   addInstanceVariableNamed: 'c';
>   addBooleanSlotNamed: 'z';
>   addClassVariableNamed: 'D';
>   use: SomeTrait;
>   use: SomeOtherTrait;
>   beWeak "if you want a weak subclass";
>   build
>
> With all of this optional. If we can avoid to pass nil as superclass for
> the cases you don't have a superclass that would be good, maybe an specific
> method in the builder ?
>
> On Mon, May 22, 2017 at 4:25 AM, Luc Fabresse <[email protected]>
> wrote:
>
>> Hi,
>>
>> Following Pharo Days, I brainstormed about some possible class definition
>> syntaxes.
>> What I have in mind:
>>
>> "basic mechanics, only THIS one in the image!"
>> ClassDefinition new
>> superclass: Object; "optional. If not specified, Object by default ;-)"
>> name: #A; "optional and create an anonymous class if not specified"
>> instVars: 'a b c';
>> traits: {TEquality};
>> package: 'Plop';
>> createClass. " this message sent might be hidden by the browser when
>> accepting"
>>
>> "---------------"
>> "Some IDEAS (but I did not find one that I really like) of
>> scripting/shorter syntaxes that must ALWAYS end up calling the above basic
>> mechanics at the end:"
>>
>> Class fromDefinition: [ :def |
>> def name: #sub;
>> instVars: 'w r g';
>> superclass: Object ].
>>
>> Object subclass  "<-- returns a subclass of Object but the problem is
>> that the new class is muted each time and the class definition is not
>> explicit"
>> name: #A;
>> ivs: 'a b c';
>> traits: { TEquality }.
>>
>> { #superclass -> Object.
>> #name -> #sub.
>> #instVars -> 'a b c' } asClass.
>>
>> { Object asSuperclass.
>>  #sub asClassName.
>> 'a b c' asInstVars.
>> 'c' asClassVar } asClass.
>>
>> "litteral approach"
>> #( name A
>> superclass Object
>> instVars #(a b c)
>> instVar d
>> ) asClass
>>
>>
>> #Luc
>>
>
>


-- 



Guille Polito


Research Engineer

French National Center for Scientific Research - *http://www.cnrs.fr*
<http://www.cnrs.fr>



*Web:* *http://guillep.github.io* <http://guillep.github.io>

*Phone: *+33 06 52 70 66 13

Reply via email to