steve at adam.com.au
Tue Feb 14 07:13:05 CET 2006
On 14/02/2006, at 12:58 PM, Chris Foote wrote:
> Any reason for using Smalltalk over Ruby ? (i.e. If you progressed
> Ruby to Smalltalk, then there must have been some benefit). How on
> earth did Objective C sneak in there ?
Now you're asking me to be a Smalltalk Troll, when I'm supposed to be
talking Ruby up... :)
I also come from the C world, and had been greatly unimpressed with
OO languages. I'm still the same way now, considering properly
implemented OO as being conceptually similar to separate processes
communicating with messages, or Charles Moore's concept of thousands
of microprocessors in one computer. Since the OO languages like C++
contained mashed up baby in the bathwater, I had disregarded the
entire concept and was struggling with implementing seperate areas
within the one namespace.
Discovering Ruby, and the way that it carefully retains procedural
syntax within co-operating objects, was a breath of fresh air. I
would argue that OO programming is in fact a way of re-introducing
all the 'evil', yet practical, ideas like global variables and
gotos... within namespace playgrounds to limit the program wide
effects. This is a good thing as far as I can see, as scoping
variables before using them is a hit and more often miss exercise in
frustration and rewriting.
I imagine that Python is much the same... just that I had my hit of
old time, nothing to do with inheritance, OO programming with another
scripting language by chance. There are other features of Ruby that
made accessing other ideas, like lambda, very simple and
straightforward. There's nothing at all mysterious about passing
blocks, and the libraries are designed with blocks in mind, so it's
just the way things get done.
On the other hand, Ruby has no native GUI libraries and I wanted a
single set of libraries or frameworks that were written in a
consistent manner, that handled just about everything without plugins
or add-ons, and had loads and loads of documentation. And definitely
not C++. So I ended up getting a Mac with OS X and Cocoa specifically
for its compatibility with Ruby's semantics. And I waited, and
waited, and I'm still waiting.
The hang-up is the simple fact that Ruby doesn't have parametric
keywording... that is to say, it doesn't have in-fix notation for the
names of arguments:
[shortStatusText setStringValue:@"Picture Sharing is off."];
This is equivalent to:
shortStatusText.setStringValue("Picture Sharing is off.");
which doesn't have any readily apparent advantage, until you start
using multiple arguments:
options("hello", "there", "world");
Is it the first argument that is the default option? Or the last? Is
there even a default option? Better check the manual!
[options firstChoice:@"hello" secondChoice:@"there"
Makes it very obvious without needing any further investigation. It
is very much worth the extra typing, and stuff becomes directly
commented without the problems of updating, rewording or having
potentially out of date comments next to functional code.
RubyCocoa does have some hacks to get around the lack of parametric
keywording, but they depend on gross megapukage wrappers like SWIG.
Plus all the attendant problems of not being able to call unwrapped
code, hence unable to load in C libraries, unable to add your own C
extensions, etc etc and so many edge case situations that it's like
programming in a straitjacket - which are the same problems Python
So, having observed that Objective C is capable of blocks and filters
and callbacks, had the same OO model as Ruby, fully supported
procedural programming, could be compiled to executables, extended
with native C code, and ran very quickly by its nature... I made the
jump across. It's not all roses, but it appears to be the best of 4
worlds. I'm still looking for a better Smalltalk scripting layer on
top, but I don't use Smalltalk the language itself as I'm not fond of
the image model as used by Squeak and traditional implementations.
I still use Ruby as a quick way of massaging text from the command
line, as it has built in Regexp and is much more concise in its
syntax. Ruby 2.0 may address some of these concerns, but being able
to compile Objective C and mix-n-match the best of 4 very simple
languages (assembler, C, ObjC, Smalltalk) is very compelling. It's
counter-intuitively strange that none of these 4 languages cause any
confusion, unlike the standardised C++ syntax where very similar
looking code represent entirely different concepts!
PS. You fed me trollbait after midnight. :)
steve at adam.com.au
More information about the sapug