Honestly, I do not like that much having a more declarative (less Smalltalksish) definition. In fact, one of the things I was always proud of showing to Smalltalk newcomers, that when they created a class, all they were doing was a "DoIt" to tell the superclass to create the new subclass. And then showing how they could copy and paste that into a workspace and DoIt. Or Debug it. So..if it were for me, I would keep a Smalltalk syntax with a plain message send. Sure, a builder kind of API is better to me, like Luc proposes. Also, I do prefer too the #createAndInstall kind of message so that we can have a flavour of #createClass that only creates the class but doesn't install it into the system. Cheers, On Mon, May 22, 2017 at 10:48 AM, Ben Coman <btc@openinworld.com> wrote:
On Mon, May 22, 2017 at 3:25 PM, Luc Fabresse <luc.fabresse@gmail.com> 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
(btw, I assume you mean mutated.)
each time and the class definition is not explicit" name: #A; ivs: 'a b c'; traits: { TEquality }.
What about...
Object subclass: [ :def | def name: 'MyClass' ; "optional and create an anonymous class if not specified" instanceVariables: 'a b c' ; classVariables: 'M N O'; classInstanceVariables: 'x y z' ; traits: {TEquality} ; package: 'Plop'].
Object>>subclass: builderBlock ^ (builderBlock value: ClassDefinition new) createClass
or similar to Guille's declarative proposal...
Object subclass: { name: 'Myclass', a: InstVar, b: InstVar, c: InstVar }
cheers -ben
-- Mariano http://marianopeck.wordpress.com