Fear and loathing of the "perlification" of Smalltalk

Igor Stasenko siguctua at gmail.com
Wed Sep 5 20:13:25 UTC 2007


Oh, my fault , i forgot that pragmas can be used as starting
exression, but not inside other valid smalltalk exression.

On 05/09/07, Jason Johnson <jason.johnson.081 at gmail.com> wrote:
> To be honest I think pragmas are starting to be overrated.  I don't
> even know where to look to see what happens when a pragma is seen.  I
> suppose it is theoretically as powerful in this particular case as
> macros, but for me the macros feel much more consistent.
>
> I would see pragmas as useful for the kind of things that Lisp does
> with declare, i.e. telling the compiler the type of the argument so it
> can specialize the method, tell the compiler to generate for fast
> code, not safety, and so on.  In other words, a kind of annotation,
> since that's what it looks like to me.
>
> On 9/5/07, Igor Stasenko <siguctua at gmail.com> wrote:
> > On 05/09/07, Jason Johnson <jason.johnson.081 at gmail.com> wrote:
> > > On 9/5/07, Blake <blake at kingdomrpg.com> wrote:
> > > > On Tue, 04 Sep 2007 21:35:43 -0700, Jason Johnson
> > > > <jason.johnson.081 at gmail.com> wrote:
> > > >
> > > > One rarely sees "Self" in Delphi. The constant references to "self" is one
> > > > of the clunkier things about Smalltalk, in my view, and is inconsistent to
> > > > boot (you have to use self to access methods but not fields?).
> > >
> > > I don't find it clunky because the methods are so small.  I don't find
> > > it inconsistent because variables are the only thing that are not
> > > messages, so if you don't see it in the method declaration it's an
> > > instance variable.  But that's just me, this is all so much easier
> > > then C++ was.
> > >
> > > > I've always felt macros tended to obscure things, but then I've only used
> > > > them in things like the C-family and PL/I.
> > >
> > > No no no.  I don't know PL/I but it's a joke to call what C has
> > > macros.  That is just search and replace prepossessing nonsense.  A
> > > lisp-style macro is the full power of the language at compile time.
> > > The only rule is, what ever the function produces has to be valid
> > > syntax because when the method is compiled, any macros are executed
> > > and their output is expanded at the call site.
> > >
> > > So, contrived example:
> > >
> > > MyClass>>generateTimestamp
> > >   ^ stream contents: [:stream|
> > >        stream
> > >          nextPutAll: 'Method compiled by ';
> > >          nextPutAll: MyClass current_author;
> > >          nextPutAll: ' on the date of ';
> > >          nextPutAll: DateAndTime now ]
> > >
> > > MyClass>>someRandomMethod
> > >    Logger log: ##(MyClass generateTimestamp), ' entering someRandomMethod'
> > >
> > > Now, as I said, this is contrived, but the thing to notice here is
> > > that the string generated by #generateTimestamp is inserted *at
> > > compile time* and is therefor a constant with all the values fixed to
> > > what they were when the method was compiled.
> > >
> > > The main use of macros in Lisp is actually to implement new control
> > > structures because the other property of macros is that they don't
> > > force evaluation of their arguments (unless they want to).  So they
> > > basically take the source code text as input and modify what actually
> > > gets compiled as C macros do, but the big difference is they have any
> > > function that was defined prior (built in or otherwise) available to
> > > help make the transformations.  Speed of the functions don't matter so
> > > much because it's at compile time (and likely incrementally compiled).
> > >
> > > Having said all that, macros aren't the same enabler in Smalltalk that
> > > they are in Lisp, but one place that stands out to me as a place they
> > > can really help Smalltalk is situations like this about adding syntax.
> > >  In Lisp the # is the place for putting custom extensions so people
> > > make reader macros for new # syntax.  If we had something like this in
> > > Smalltalk then it would mean to do what {} does we wouldn't have to
> > > touch a compiler.  Just define a reader macro (how ever that would be
> > > done) that does the text conversion of e.g. #{} to the smalltalk
> > > syntax equivalent of whatever {} is outputting now.
> > >
> > >
> > Dont forget about pragma syntax in smalltalk.
> > Currently it used only for generating primitives in method headers,
> > but with subtle changes pragma can be used as a macro without
> > introducing any new #... constructs.
> >
> > Then sample above can be written with pragma:
> >
> > MyClass>>someRandomMethod
> >   Logger log: <MyClass generateTimestamp> , ' entering someRandomMethod'
> >
> > --
> > Best regards,
> > Igor Stasenko AKA sig.
> >
> >
>
>


-- 
Best regards,
Igor Stasenko AKA sig.



More information about the Squeak-dev mailing list