On Sun, Sep 30, 2007 at 10:47:42PM +0900, 7stud -- wrote:
> I would choose python.
> 
> 1)
> >a clean (probably one of the cleanest) object oriented design, example:
> <snip>
> 
> Convert the number 12 to a string:
> 
> ruby: my_str = 12.to_s
> 
> python: my_str = str(12)
> 
> I have a hard time understanding how either method has an advantage over 
> the other.  It's totally irrelevant in my opinion.  Personally, I think 
> using a number to call a method looks ugly.  But I can adapt pretty 
> easily.

Technically, you're using "to_s" to call a method -- but you're sending
the "to_s" message to the "12" object.  From an object-oriented
perspective, the 12.to_s syntax is more consistent than the str(12)
syntax -- which is probably the point the previous comment meant to make.


> 
> 2)
> - a simpler (not simple by any means, but simpler) Inheritance Model
> 
> I have never studied a simple inheritance model.  I don't have enough 
> experience with Ruby's inheritance model yet to know which is simpler. 
> Once again, I think trying to decide which is simpler is totally 
> irrelevant--especially for a beginner who has never programmed in any 
> language before.

I think a simpler inheritance model could be of great value to someone
who has never done OOP before -- because a simpler inheritance model
should translate into a shallower learning curve.  That's usually the
case with simpler things.

On the other hand, I'm not familiar enough with Python's inheritance
model to be able to make any personal judgment about which is simpler.
For all I know, I may have just made a case for learning Python first,
even though I don't much like the language.


> 
> 3)
> - a little bit less esotheric (syntax and metraprogramming) thus what
> you learn about Ruby will be more usable for other languages e.g.
> Smalltalk
> 
> I think ruby's syntax looks like chicken scratchings, and I have a C++ 
> background. C++ has the most difficult syntax I have seen--except maybe 
> perl's.  In my opinion, python's syntax is much more human readable than 
> ruby's.  I guess if you are coming from perl, then ruby's syntax would 
> seem incredibly clear.  Of course, if you know a language well, it's 
> easy to read.  I think the test is whether someone who doesn't know a 
> language well can make heads or tails out of what is going on in some 
> basic code. I don't think ruby is ever going to be readable in that way.

I disagree quite a lot.  I find Ruby's syntax marginally cleaner than
Python's, and Perl's only marginally less clean than Python's.  I also
find that for me, personally, Python's syntax is eye-stabbingly
disconcerting and somewhat obtuse at times (e.g., excessive requirements
for explicit references to self), though I realize that's in large part a
result of personal preference.  Even leaving the personal preference
aside, however, I still think Ruby's syntax is just a touch cleaner,
except perhaps in areas where "cleaner" translates to "missing
something".

I found Ruby much easier to reason through without having to already know
the language than Python, back when I knew neither -- despite the fact
that Python is full of function(arg) to mix in with the object.method,
while Ruby is more consistently object.method, and I was nowhere near as
familiar with object.method syntax as I was with function(arg) syntax at
the time.  Your mileage obviously varies.

In fact, in many ways, I think Python's syntax is more Perl-like than
Ruby's.  Leading sigils on variable names are not the only signs of
similar syntactic design, y'know -- and, in fact, are among the most
superficial and easily ignored of those signs.


> 
> Ruby also relies heavily on regex's, and regex's are never going to be 
> easy to read for anyone.  regex's are not beginner friendly, and that 
> might be a big barrier for a beginner trying to learn ruby.  There are 
> lots of people who just can't learn regex's.

Uh . . . what?

  1. I find regexen very easy to read.  I guess I must not be part of
  "anyone".

  2. Ruby doesn't "rel[y] heavily" on regexen.  It provides regex
  capabilities with a very simple, easy-to-use syntax that doesn't
  require obtuse library calls the way Python does, thus making regex use
  less painful.  As a result, people probably make use of the power of
  the regex more often in Ruby than in Python -- not because writing Ruby
  somehow magically requires you to use regexen more often, but because
  there's less reason to avoid them since they're easier to use.

I have yet to see anything that would lead me to believe that one must
use regexen more often in Ruby than in Python.  I just see more hurdles
in the way of using them in Python than in Ruby, when they're appropriate
for use.


> 
> 
> 4)
> - simpler, Python got very, very powerful but at the cost of advanced
> techniques, the Ruby learning curve will be much flatter.
> 
> I doubt that Ruby's learning curve is flatter.  I think python and ruby 
> are close neighbors as far as languages go.  In fact, there are some 
> similarities that it will make you wonder who copied who with regard to 
> certain features.  However, I would guess that python's learning curve 
> is easier for beginners because the subject of classes doesn't come up 
> until about the middle of a python book.  python is a language that can 
> be used effectively without classes if the concept of classes is too 
> difficult for a beginner to grasp.

You had me until you started talking about classes.  Ruby can be very
easily used in a superficially imperative/procedural style, same as
Python.  Just create global methods and use them as if they were plain
ol' procedural functions.  I don't see where you get the impression that
one must necessarily jump right into defining classes, unless you've just
seen that most Ruby books tackle classes early.

Of course, the reason most Ruby books tackle classes early is that for
languages like Ruby and Python it's usually *better* to do proper OO
programming than to pick up the scalpel and try to use it to hammer
nails.  I think it's a *good* thing to tackle classes sooner rather than
later in either Ruby or Python, as long as it's handled reasonably well,
because neither language really comes into its own without using object
oriented programming techniques *well*.

Why teach someone to write BASIC using Python or Ruby?


> 
> Overall, I think python's online documentation is pretty poor, but I 
> think ruby's is worse.  In my opinion, only php got it right.  They 
> opened up the online documentation to user comments, and now every 
> single issue that has ever been encountered with any function is 
> discussed in the comments to the documentation.  That is incredibly 
> valuable information.  If ruby wanted to take a significant step forward 
> in its online documentation relative to python, I think they should copy 
> the php model.  One solution to the poor online docs for both ruby and 
> python is to buy a good book.

Oh, gawd, no.  I agree that both Python and Ruby documentation
desperately needs some help, and I agree that having (separate, but
associated) user comment documentation is a great idea, but much of what
I've seen for PHP documentation is crap.  The "official" documentation
tends to be of better quality in Ruby and Python than in PHP and, while
the user comment documentation is an important addition to the official
documentation, it's also a little bit more *needed*.

I haven't used online Python documentation enough to have an opinion
about how it compares to online Ruby documentation, I'm afraid.  You may
very well be right that Python's is better, in general.  On the other
hand, Perl's online documentation puts both of them to shame, by a wide
enough margin that it has time left to make the documentation of a bunch
of other languages look crappy by comparison at the same time, all while
having a nice leisurely cup of tea.

Maybe both Ruby and Python could learn from Perl's documentation as well.


> 
> There is also more information about python available on the web since 
> the python community is much larger.

I rather suspect the gap in community sizes is shrinking, and while I
don't know personally whether your estimation of the quantity of Python
information online compared with that of Ruby is accurate, I do know that
I've never felt like there wasn't *enough* information about Ruby.
There's a *lot* of information about Ruby online, and past a certain
point it doesn't matter much which has a few hundred extra documents
available online.


> 
> 5)
> - and this is my favorite: "Code Blocks", learning to use code blocks
> is probably the single greatest benefit from learning Ruby, Python
> just will not give this to you.
> 
> I don't know what "code blocks" are and the subject isn't in the 
> appendix of ruby's bible: pickaxe2, so I can't comment on that.

Try looking for "block" in the index.  That'd probably help.  The syntax
of a (code) block in Ruby tends to look like one of the following two
examples:

  1.  object.method { |var| var.method }

  2.  object.method do |var|
        var.method
      end


> 
> 6) I find tracking down errors is more difficult in ruby than python. 
> python has better error messages.  For instance, in ruby if you forget 
> one 'end' in your code somewhere('end' is used to terminate a section of 
> code), the error message will say that there is an  error on the last 
> line of your program.  As a result, you have to go hunting through your 
> whole program to figure out where you forgot an 'end'.  That's 
> aggravating.

I have seen errors just as annoying for Python indentation mistakes.
I've seen, for instance, code that offers no errors at all and simply
executes in an unintended manner thanks to indentation mistakes.  I don't
think either language really "wins" in terms of loop termination errors
and the like.


> 
> 7) There are some really nice little touches that python implements, 
> which make programming less aggravating.  I'll highlight one.

<snip some stuff about puts vs. print in Ruby vs. Python>

This looks like a wash, to me -- with the most common cases making Ruby a
little easier.  Space-separated collections of output from separate
variables are much, much less common than newline-separated, in my
experience, though if you deal with space characters as delimiters I can
see how you might find Ruby's behavior slightly annoying.  I find it more
convenient.

On the other hand, you could always do something with an iterator block
in Ruby, perhaps defining a method if you have to output a *lot* of
space-separated collections of output from variables in a given program.

I suspect there may be a built-in global variable in Ruby you can set to
get your desired behavior, too -- but I'm not sure, and wouldn't know
what it is if so (since it's not behavior I tend to desire).  Does anyone
out there know for sure whether there is such a beast?


> 
> 8) Then there are the well documented major shortcomings of Ruby---it is 
> slow.  Rubyists will say, "Who cares?!  I'm in no rush to get the 
> results of my programs."  That's well and good, but it's nice to have 
> more speed if you need it.  Rubyists will counter, "If I need the speed, 
> I'll program in C."  That's great if you know C, but what if you only 
> know ruby?  python executes much faster than ruby, and just like ruby, 
> you can program the slow parts in C if you need even more speed.

Slow:

  1. Sometimes, it's slower than Python.  Others, it's faster, as
  demonstrated with a simple string concatenation exercise in a recent
  thread right here in ruby-talk.  It went something like this:

    #!/usr/bin/env ruby
    i = 0
    string_var = ''
    while input = gets
      i += 1
      string_var << input
      puts(i) if i % 1000 == 0
    end

    #!/usr/bin/env python
    i = 0
    string_var = ''
    for input in sys.stdin:
      i += 1
      string_var += input
      if i % 1000 == 0: print i

  In case it's not clear, Ruby won that little performance.  (Disclaimer:
  I did that from memory, and may have misremembered some specifics of
  the example code.)

  2. Sometimes, code execution speed doesn't matter that much.

  3. Ruby 1.9 is reportedly much, *much* faster than Ruby 1.8.x, so you
  may very quickly find your statements about how slowly Ruby executes
  "obsolete".

  4. There's a small enough difference between Ruby and Python that I
  really don't understand why anyone would give that much of a damn about
  which of the two is faster anyway.  If you really want to compare
  execution speed, put your language of choice up against OCaml, C, or
  even assembly language.

Others may have opinions that differ from mine, of course.

-- 
CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ]
Ben Franklin: "As we enjoy great Advantages from the Inventions of others
we should be glad of an Opportunity to serve others by any Invention of
ours, and this we should do freely and generously."