Forum: Ruby Bruce Eckel wouldn't know why to switch from Python to Ruby

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
4f6cd1f9fee5e009b6b6781dbc6b5ac6?d=identicon&s=25 cyberco (Guest)
on 2005-12-20 17:00
(Received via mailing list)
Bruce Eckel (author of amongst other popular books 'Thinking in Java')
has doubts why anybody would switch from Python to Ruby. An interesting
read:

http://www.artima.com/weblogs/viewpost.jsp?thread=141312

To quote him:

"The person I want to hear from is the core Python expert, someone who
knows that language incredibly well, who has decided that Ruby is just
so much better that all the mature Python libraries and community
expertise doesn't hold a candle to the value of moving to Ruby. That
person would be able to make a compelling, feature-by-feature argument"

Any Python experts here? :)
5befe95e6648daec3dd5728cd36602d0?d=identicon&s=25 Robert Klemme (Guest)
on 2005-12-20 17:40
(Received via mailing list)
cyberco wrote:
> Bruce Eckel (author of amongst other popular books 'Thinking in Java')
> has doubts why anybody would switch from Python to Ruby. An
> interesting read:
>
> http://www.artima.com/weblogs/viewpost.jsp?thread=141312

Thanks for the interesting read!

> To quote him:
>
> "The person I want to hear from is the core Python expert, someone who
> knows that language incredibly well, who has decided that Ruby is just
> so much better that all the mature Python libraries and community
> expertise doesn't hold a candle to the value of moving to Ruby. That
> person would be able to make a compelling, feature-by-feature
> argument"
>
> Any Python experts here? :)

They probably forgot all their Python once they started with Ruby... ;-)

    robert
B5e329ffa0cc78efbfc7ae2d084c149f?d=identicon&s=25 David Balmain (Guest)
on 2005-12-20 18:13
(Received via mailing list)
I've done some programming in Python. I have to say that it's really
difficult trying to compare the two languages. Saying one is better
than the other seems pointless to me. Really it just comes down to
which language fits your brain the best. And even then, why limit
yourself to one. As the pragmatic programmes espouse, it really helps
to learn as many languages as you can.

Dave
49de3af41258a5772a1bad5c1533191d?d=identicon&s=25 Robert Hicks (Guest)
on 2005-12-20 18:13
(Received via mailing list)
I don't think he has "doubts" about someone switching. He wants to see
a detailed comparison between the two from someone who knows. I read
his piece and aside from Rails he wants to know "why Ruby?"

Unfortunately I have read some not so good replies from the Ruby
community.

Robert
1b62a85b59ccab03b84ee5ec378f75b4?d=identicon&s=25 Steve Litt (Guest)
on 2005-12-20 19:04
(Received via mailing list)
On Tuesday 20 December 2005 10:57 am, cyberco wrote:
> that Ruby is just so much better that all the mature Python
> libraries and community expertise doesn't hold a candle to the
> value of moving to Ruby. That person would be able to make a
> compelling, feature-by-feature argument"
>
> Any Python experts here? :)

I'm nowhere near a Python expert (nor a Ruby one) but I'll tell you
one thing -- with Python you can make a private class member only
by prepending a double underscore, and there are no protected class
members at all. I think the encapsulation is better in Ruby.

Python's an excellent language, and I really appreciate its
subordination by indentation (see
http://www.troubleshooters.com/tpromag/199908/inde...
for reasons).

SteveT
788622ab7e1f792ca653eeacbe5c1db3?d=identicon&s=25 rcoder (Guest)
on 2005-12-20 20:20
(Received via mailing list)
Eckel's article is getting pretty long in the tooth at this point -- I
remember reading it back when I was a Python user several years ago,
and it actually delayed my swith to Ruby for a few months, at least. I
probably don't qualify as a Python expert, but after being exposed to
both for non-trivial projects, there are definitely some differences
that make me prefer Ruby.

First, because all object "slots" in Python are public, (stupid
conventions like underscore prefixes aside) you see a lot of code like
this:

obj.setFoo("bar")

This is because 'obj.foo = "bar"' is a direct assignment, with no
method call involved. Since that's an encapsulation no-no, you get a
bunch of long-winded setFoo and getFoo methods all over the place,
which gives me nasty flashbacks to my days writing Java code. (Note:
this is probably getting better now with the standard decorator syntax
making automatic slot wrapper code generator more acceptable in the
Python world.)

Second, the crippled 'lambda' form (you can't include multiple
statements, since Python imposes its fugly statement/expression
separation) means you either a) give up on some very elegant potential
uses of first-order functions, or b) pollute your namespace with a
bunch of throw-away definitions that should be anonymous. Blocks and
proc/lamba objects feel more expressive, at the cost of having to use
the #call or #[] methods to actually invoke them.

Also, while I'm less than proud to admit it, a few of the "Perl-isms"
in Ruby, such as the =~ operator, simply seem more natural to me than
their Python equivalents. I try to avoid using the special syntax and
"magic" globals like $1, $2, et. al., but having spent so much time
wearing a sysadmin hat, (and we all know that means reading and hacking
on Perl code) it's nice to just be able to toss out regexp-based
one-liners when the urge/need arises.

Finally, metaprogramming in Ruby has always been a more straightforward
and common practice than in Python. The combination of
{class,module,instance}_eval, blocks, symbols (as a compact
representation of method and attribute names), and import/subclass
callbacks just makes more sense, IMHO, than metaclasses and multiple
inheritance, which are more or less essential for idiomatic Python
metaprogramming.

I do miss a few things: most importantly, list comprehensions, and
imported modules simply being another object/namespace to be used with
normal dot-notation. Python has also had a clean syntax for keyword
arguments in method calls for some time, and while I'm pretty
comfortable with the implicit hash-conversion model, it still feels
hacking compared to real kwargs.

Regardless, I agree with the folks earlier in the thread who've said
that you should pick the language that fits your brain better. For
recovering Java programmers, that may well be Python, as the heavy use
of inheritance and explicit setters and getters won't require any major
shift in design practices. On the other hand, if you're coming from
Perl, or maybe even C++, where the style is more fluid, Ruby will
probably feel more efficient, since you end up writing less boilerplate
code, and using a flatter class hierarchy.

-Lennon
0c00d644de3b8bb2f655908c79af25a5?d=identicon&s=25 Matt Lawrence (Guest)
on 2005-12-20 20:38
(Received via mailing list)
On Wed, 21 Dec 2005, cyberco wrote:

> "The person I want to hear from is the core Python expert, someone who
> knows that language incredibly well, who has decided that Ruby is just
> so much better that all the mature Python libraries and community
> expertise doesn't hold a candle to the value of moving to Ruby. That
> person would be able to make a compelling, feature-by-feature argument"

I'm not sure that Ruby really is so much better than Python that a
Python
expert would want to switch.  Python is really good in many ways.
Starting from scratch, not knowing either, I'm glad I went with Ruby,
but
if I had gone with Python, I'm not sure I would switch.

-- Matt
Nothing great was ever accomplished without _passion_
992fe8c19bbbc27f2b562a9f96efc03d?d=identicon&s=25 Jamis Buck (Guest)
on 2005-12-20 20:38
(Received via mailing list)
Excellent comparison, Lennon. Thanks for taking the time to post this.

- Jamis
Fd22ee3cfc7dac283ce8e451af324f7d?d=identicon&s=25 Chad Perrin (Guest)
on 2005-12-20 20:56
(Received via mailing list)
On Wed, Dec 21, 2005 at 04:35:59AM +0900, Matt Lawrence wrote:
> Starting from scratch, not knowing either, I'm glad I went with Ruby, but
> if I had gone with Python, I'm not sure I would switch.

Keep in mind that I'm an absolute non-expert in both Ruby and Python
when I say this.  I know Perl better than both (and still rather like
it), and I'm not even an expert in that.  However, this is my
impression:

Ruby and Python are both excellent languages.  Ruby is incrementally
better than Python in a fair number of ways.  Python is incrementally
better than Ruby -- as far as I have been able to determine, in very few
ways.  In both cases, it's only incrementally better, nothing
earth-shattering.  They're close enough that the determining factor, if
you have a preference, is to choose the language that "feels" best.  Of
course, I could easily be wrong about any of this.

Since Python source code makes my eyes bleed, I'll stick with Ruby.

--
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]

unix virus: If you're using a unixlike OS, please forward
this to 20 others and erase your system partition.
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-20 23:55
(Received via mailing list)
Steve Litt ha scritto:

>>Any Python experts here? :)
>
>
> I'm nowhere near a Python expert (nor a Ruby one) but I'll tell you
> one thing -- with Python you can make a private class member only
> by prepending a double underscore, and there are no protected class
> members at all. I think the encapsulation is better in Ruby.

OTOH encapsulation may be considered better in python since you can be
(quite) sure that __methods and class variables won't break when
redefined by accident in a subclass.

Ruby vs Python is mostly a matter of taste, bith are fine languages, and
I second Robert Hicks' impression that there were overreactions to
Eckel's article from some people.
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-20 23:58
(Received via mailing list)
rcoder ha scritto:
>
> obj.setFoo("bar")
>
> This is because 'obj.foo = "bar"' is a direct assignment, with no
> method call involved.

I think you'have been away from python far too long, recent python (3 or
4 versions I think_) has a nice thing called properties.
Basically you can declare "foo" to have setters and getters when you
need it, and still threat them in the same way (i.e. "obj.foo = bar"
becomes a method call). 80% of the times someone writing a setFoo or
getFoo is doing it because (s)he was a java/c++ developer.

OTOH I notice that you're aware of the decorator syntax which is far
more recente, so maybe this thing just slipped away :)
682fff6db11e1a150d6ce17f3b862448?d=identicon&s=25 Doug H (Guest)
on 2005-12-21 00:43
(Received via mailing list)
gabriele renzi wrote:
> > this:
> becomes a method call). 80% of the times someone writing a setFoo or
> getFoo is doing it because (s)he was a java/c++ developer.

Properties in python don't work with subclasses, however.

#python:

class A(object):
	def __init__(self):
		self.x = 0
	def getX(self):
		return self.x
	def setX(self, val):
		self.x = val
	X = property(fget=getX, fset=setX)

class B(A):
	def getX(self):
		return self.x + 1

b = B()
print b.X   # 0 instead of 1, uh oh

#######################

#ruby:

class A
	attr_accessor :X
	def initialize
		@X = 0
	end
end
class B<A
	def X
		@X+1
	end
end

b = B.new
puts b.X  # 1
682fff6db11e1a150d6ce17f3b862448?d=identicon&s=25 Doug H (Guest)
on 2005-12-21 00:49
(Received via mailing list)
That should have been
return super(B, self).getX() + 1
instead of
return super(B, self).getX + 1
Didn't notice error.
918c6daad03c85e51ad1a11f57017947?d=identicon&s=25 Devin Mullins (Guest)
on 2005-12-21 05:14
(Received via mailing list)
Woah! Thread-ahoy. Sorry if I'm duplicating content here:

Robert Hicks wrote:

>I don't think he has "doubts" about someone switching. He wants to see
>a detailed comparison between the two from someone who knows. I read
>his piece and aside from Rails he wants to know "why Ruby?"
>
>
His piece comes off as nothing but vitriol, ad hominem, and rhetoric to
me. I choose not to get involved in the conversation. Other people
reacted differently, it seems.

Nonetheless, the Python vs Ruby question comes up a lot, and is somewhat
legitimate. I only played with Python for a little over a week. Here's
my (very) rough opinion:
- Ruby feels more object-oriented to me. Doing things the
object-oriented way was *extremely* easy. Everything is object.method
syntax (or, even cooler, delegated to a method, like the for...in
syntax).
- There's no extra code for packaging up code into a library, and no
conceptual overhead for method/class extraction.
- No frickin' __underscores__!
- It's hooks for dynamic classivity make more sense to me.

Of course, this is pretty much all personal.

Devin
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-21 13:15
(Received via mailing list)
Devin Mullins ha scritto:
>Everything is object.method
> syntax (or, even cooler, delegated to a method, like the for...in syntax).

just to say for..in is delegated to a method in python too, and they
even delegate  "if obj" to a method call :)
5da4c52f43677f395aff5bde775593c2?d=identicon&s=25 Daniel Schierbeck (dasch)
on 2005-12-21 13:33
(Received via mailing list)
gabriele renzi wrote:
> Devin Mullins ha scritto:
>> Everything is object.method syntax (or, even cooler, delegated to a
>> method, like the for...in syntax).
>
> just to say for..in is delegated to a method in python too, and they
> even delegate  "if obj" to a method call :)

That's so cool. We need that. Now. Generally, though, I think Python's
__underscore__ convention is pretty annoying, though I can see why you
wouldn't want to add predefined semantics to general words like "new",
"get", etc.


Cheers,
Daniel
788622ab7e1f792ca653eeacbe5c1db3?d=identicon&s=25 rcoder (Guest)
on 2005-12-21 19:48
(Received via mailing list)
Thanks for reminding me -- I have indeed been away from Python since
"way back" in the 2.1 days or so, and while I vaguely recall seeing
discussion of properties, it was after I had moved to Ruby, so it
really didn't jump out and grab me, as the interest was mostly within
the Python community.

Decorators, on the other hand, got a lot of attention in the language
community at large, since they were so comically controversial when
first added to the language.

Regardless, I suspect you'll still find a great deal of code like I
described out there "in the wild," since many non-trivial applications
implemented in Python target several older versions, and the syntax
changes for most of the 2.X updates were non-trivial.

(Mildly OT observation: one of the interesting side-effects of Python's
early adoption by Red Hat was that a single, canonical version of the
runtime was distributed with each release of the OS, and the system
depended on it heavily. This meant that a lot of Python-based
applications had to be written to the oldest Python packaged by Red Hat
for the OS versions they wanted to support, rather than the oldest
release a Python user would be likely to have installed. I suspect that
something similar is already starting in the Ruby world, as Rails has
already caused problems for people trying to upgrade to 1.8.3 and
1.8.4.)

-Lennon
3a0d61d465c296f7f291b5bd09c90a4a?d=identicon&s=25 tony summerfelt (Guest)
on 2005-12-22 14:29
(Received via mailing list)
cyberco wrote on 12/20/2005 10:57 AM:

> To quote him:

> "The person I want to hear from is the core Python expert, someone who

ruby has one thing going for it that python doesn't: ruby's oo doesn't
seem 'tacked on' like it does in python.

a newbie trying to choose between ruby and python (with oo being their
main priority) has an easy choice: ruby, because it's oo from the
ground up...

as for a switch, i seriously doubt any 'core python expert' will even
touch ruby. and by placing that as a requirement he has cemented his
belief that he won't be convinced...

i found that one of the first things a python programmer will ask when
you mention ruby is "does it have tuples? does it have dictionaries?"
as if programming efficiently required them.
3a0d61d465c296f7f291b5bd09c90a4a?d=identicon&s=25 tony summerfelt (Guest)
on 2005-12-22 14:32
(Received via mailing list)
Doug H wrote on 12/20/2005 6:42 PM:
> #python:

> #ruby:

is it just me or did that ruby code look a lot cleaner?
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-22 19:44
(Received via mailing list)
tony summerfelt ha scritto:
> Doug H wrote on 12/20/2005 6:42 PM:
>
>>#python:
>
>
>>#ruby:
>
>
> is it just me or did that ruby code look a lot cleaner?

I think everyone can agree :)

But the python approach is maybe a little more pragmatic, in most use
cases you'd write this in ruby:
  class Foo
   attr_accessor :foo
   def initialize foo
    @foo = foo
   end
   end
  end
while in python it would be:
  class Foo:
   def __init__(slf,foo):
    slf.foo=foo

relying on the fact that you could translate variable access into an
accessor method when needed withouth breaking the interface.
OTOH some hardcore-OO people could object that allowing access to
instance variables by default may be a bad habit.
tomayto tomahto, I'd say.
A7c9c275318af9e1e3812fab9660cd7c?d=identicon&s=25 Jeff Wood (Guest)
on 2005-12-22 19:53
(Received via mailing list)
... be careful, you're gonna bring down the python coding police ...

Although not a physical requirement of the runtime, you named your first
variable in the class method slf ... the python community would eat you
alive for that ...

They prefer ( and *ALL* their docs make sure to tell you over and over )
that the first parameter of the class method be named self.

... Dive into python and every other tutorial on the topic actually
stops to
make sure you understand this ...

I find it humorous ... and a bit retentive ... but, to each their own.

j.

On 12/22/05, gabriele renzi <surrender_it@-remove-yahoo.it> wrote:
> > is it just me or did that ruby code look a lot cleaner?
>    end
> tomayto tomahto, I'd say.
>
>


--
"Remember. Understand. Believe. Yield! -> http://ruby-lang.org"

Jeff Wood
Fd22ee3cfc7dac283ce8e451af324f7d?d=identicon&s=25 Chad Perrin (Guest)
on 2005-12-22 20:17
(Received via mailing list)
On Fri, Dec 23, 2005 at 03:42:50AM +0900, gabriele renzi wrote:
> while in python it would be:
>  class Foo:
>   def __init__(slf,foo):
>    slf.foo=foo

Argh.  It looks unfinished.  It's asymmetrical, and not in a beautiful
way.

It's shorter than the Ruby example, but it makes my eyes bleed.  An
episode of The Apprentice is shorter than The Maltese Falcon, too, but
it's a hell of a lot uglier.

. . . at least, for my taste.

When I want short code, I write it in Perl.

--
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]

unix virus: If you're using a unixlike OS, please forward
this to 20 others and erase your system partition.
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-23 04:19
(Received via mailing list)
Chad Perrin ha scritto:
>
> It's shorter than the Ruby example, but it makes my eyes bleed.  An
> episode of The Apprentice is shorter than The Maltese Falcon, too, but
> it's a hell of a lot uglier.
>
>  . . at least, for my taste.
>
> When I want short code, I write it in Perl.

de gustibus non est disputandum
32edd0717b3144d5c58a352d613abdc9?d=identicon&s=25 gabriele renzi (Guest)
on 2005-12-23 04:19
(Received via mailing list)
Jeff Wood ha scritto:
> make sure you understand this ...
>
> I find it humorous ... and a bit retentive ... but, to each their own.
>
> j.

you're absolutely right, but in my defense I can say that I did write
that becuase I feel the need to explicitly name self dumb. I find it ok
to write self.foo but naming the argument is just useless imho.
Fd22ee3cfc7dac283ce8e451af324f7d?d=identicon&s=25 Chad Perrin (Guest)
on 2005-12-23 04:22
(Received via mailing list)
On Fri, Dec 23, 2005 at 12:17:50PM +0900, gabriele renzi wrote:
> >way.
> >
> >It's shorter than the Ruby example, but it makes my eyes bleed.  An
> >episode of The Apprentice is shorter than The Maltese Falcon, too, but
> >it's a hell of a lot uglier.
> >
> > . . at least, for my taste.
> >
> >When I want short code, I write it in Perl.
>
> de gustibus non est disputandum

Um.  Okay?

--
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]

unix virus: If you're using a unixlike OS, please forward
this to 20 others and erase your system partition.
5befe95e6648daec3dd5728cd36602d0?d=identicon&s=25 Robert Klemme (Guest)
on 2005-12-23 09:35
(Received via mailing list)
Chad Perrin wrote:
>>> Argh.  It looks unfinished.  It's asymmetrical, and not in a
>> de gustibus non est disputandum
>
> Um.  Okay?

We Germans say "Über Geschmäcker kann man streiten" - interestingly enough
it's the negated translation of the Latin "You cannot argue about
likings"... :-)

    robert
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2005-12-23 15:43
(Received via mailing list)
On 12/22/05, Chad Perrin <perrin@apotheon.com> wrote:
> On Fri, Dec 23, 2005 at 12:17:50PM +0900, gabriele renzi wrote:
> > Chad Perrin ha scritto:
> > de gustibus non est disputandum
>
> Um.  Okay?

Four years of high school (although that was sometime ago now) to the
rescue:

In matters of taste there can be no dispute.

Colloquially in English: you say potato, I say potato :-)
1b62a85b59ccab03b84ee5ec378f75b4?d=identicon&s=25 Steve Litt (Guest)
on 2005-12-23 16:49
(Received via mailing list)
On Friday 23 December 2005 09:40 am, Patrick Hurley wrote:
> In matters of taste there can be no dispute.
>
> Colloquially in English: you say potato, I say potato :-)

Is de gustibus non est disputandum Italian, Latin or something else?
I can think of many threads I'd like to use that phrase in.

SteveT

Steve Litt
http://www.troubleshooters.com
slitt@troubleshooters.com
A7c9c275318af9e1e3812fab9660cd7c?d=identicon&s=25 Jeff Wood (Guest)
on 2005-12-23 16:55
(Received via mailing list)
latin.

On 12/23/05, Steve Litt <slitt@earthlink.net> wrote:
> > the rescue:
> Steve Litt
> http://www.troubleshooters.com
> slitt@troubleshooters.com
>
>


--
"Remember. Understand. Believe. Yield! -> http://ruby-lang.org"

Jeff Wood
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2005-12-23 17:59
(Received via mailing list)
On 12/23/05, Steve Litt <slitt@earthlink.net> wrote:
> On Friday 23 December 2005 09:40 am, Patrick Hurley wrote:
> > Four years of high school (although that was sometime ago now) to
> > the rescue:

Oops that was supposed to be four years of high school latin :-)
Ff260830c27224f0e15f37362a6256d0?d=identicon&s=25 Paul Duncan (Guest)
on 2005-12-28 02:50
(Received via mailing list)
* Steve Litt (slitt@earthlink.net) wrote:
[snipped]
> Is de gustibus non est disputandum Italian, Latin or something else?
> I can think of many threads I'd like to use that phrase in.

Quidquid latine dictum sit, altum viditur. [*]

> SteveT

* I don't know Latin but my buddy Google does.
1b62a85b59ccab03b84ee5ec378f75b4?d=identicon&s=25 Steve Litt (Guest)
on 2005-12-28 06:53
(Received via mailing list)
On Tuesday 27 December 2005 08:49 pm, Paul Duncan wrote:
> * Steve Litt (slitt@earthlink.net) wrote:
> [snipped]
>
> > Is de gustibus non est disputandum Italian, Latin or something else?
> > I can think of many threads I'd like to use that phrase in.
>
> Quidquid latine dictum sit, altum viditur. [*]

E rubimus codimus

SteveT

Steve Litt
http://www.troubleshooters.com
slitt@troubleshooters.com
Fd22ee3cfc7dac283ce8e451af324f7d?d=identicon&s=25 Chad Perrin (Guest)
on 2005-12-28 09:48
(Received via mailing list)
On Wed, Dec 28, 2005 at 02:51:35PM +0900, Steve Litt wrote:
> On Tuesday 27 December 2005 08:49 pm, Paul Duncan wrote:
> > * Steve Litt (slitt@earthlink.net) wrote:
> > [snipped]
> >
> > > Is de gustibus non est disputandum Italian, Latin or something else?
> > > I can think of many threads I'd like to use that phrase in.
> >
> > Quidquid latine dictum sit, altum viditur. [*]
>
> E rubimus codimus

Carpe rubium.

Et tu, Ruby?

Okay, never mind.  Forget I said anything.  That was really bad.

--
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]

This sig for rent:  a Signify v1.14 production from
http://www.debian.org/
2bbd790a07af3baf216495894208c1d0?d=identicon&s=25 Alan Garrison (Guest)
on 2005-12-28 14:01
(Received via mailing list)
Chad Perrin wrote:
>
> Carpe rubium.
>
> Et tu, Ruby?
>
> Okay, never mind.  Forget I said anything.  That was really bad.
>

Quondo Omni Flunkus Utor Ruby

(with apologies to Red Green fans :)
This topic is locked and can not be replied to.