F
Francois
I discovered Python a few months ago and soon decided to invest time in
learning it well. While surfing the net for Python, I also saw the hype
over Ruby and tried to find out more about it, before I definitely
embarked on studying and practicing Python. I recently found two
sufficient answers for choosing Python - which is a personal choice and
others may differ, but I'd like to share it anyway :
1) In Ruby there is a risk of "Variable/Method Ambiguity" when calling
a method with no parameters without using () :
Here is an excerpt from the book "Programming Ruby The Pragmatic
Programmer's Guide".
http://www.rubycentral.com/book/language.html
"When Ruby sees a name such as ``a'' in an expression, it needs to
determine if it is a local variable reference or a call to a method
with no parameters. To decide which is the case, Ruby uses a heuristic.
As Ruby reads a source file, it keeps track of symbols that have been
assigned to. It assumes that these symbols are variables. When it
subsequently comes across a symbol that might be either a variable or a
method call, it checks to see if it has seen a prior assignment to that
symbol. If so, it treats the symbol as a variable; otherwise it treats
it as a method call. As a somewhat pathological case of this, consider
the following code fragment, submitted by Clemens Hintze."
def a
print "Function 'a' called\n"
99
end
for i in 1..2
if i == 2
print "a=", a, "\n"
else
a = 1
print "a=", a, "\n"
end
end
OUTPUTS >>
a=1
Function 'a' called
a=99
"During the parse, Ruby sees the use of ``a'' in the first print
statement and, as it hasn't yet seen any assignment to ``a,'' assumes
that it is a method call. By the time it gets to the second print
statement, though, it has seen an assignment, and so treats ``a'' as a
variable.
Note that the assignment does not have to be executed---Ruby just has
to have seen it. This program does not raise an error."
I tried the code above at the interactive Ruby 1.8.2 interpreter :
http://www.ruby.ch/tutorial/
2) Ruby does not have true first-class functions living in the same
namespace as other variables while Python does :
In Python :
def sayHello (name) :
return "Hello " + name
print sayHello("Mr. Bond")
m = sayHello
print m
print m("Miss Moneypenny")
OUTPUTS >>
Hello Mr. Bond
<function sayHello at 0x0102E870>
Hello Miss Moneypenny
In Ruby you need extra syntax that ruins the "first-class-ness" :
def sayHello (name)
return "Hello " + name
end
puts sayHello("Mr. Bond")
m = Class.method
sayHello)
puts m
puts m.call("Miss Moneypenny")
OUTPUTS >>
Hello Mr. Bond
#<Method: Class(Object)#sayHello>
Hello Miss Moneypenny
4) Conclusion
Since I did a lot of work in Scheme, rigor and consistency are most
important to me, and Python certainly meets this requirement.
--- Python newbie
learning it well. While surfing the net for Python, I also saw the hype
over Ruby and tried to find out more about it, before I definitely
embarked on studying and practicing Python. I recently found two
sufficient answers for choosing Python - which is a personal choice and
others may differ, but I'd like to share it anyway :
1) In Ruby there is a risk of "Variable/Method Ambiguity" when calling
a method with no parameters without using () :
Here is an excerpt from the book "Programming Ruby The Pragmatic
Programmer's Guide".
http://www.rubycentral.com/book/language.html
"When Ruby sees a name such as ``a'' in an expression, it needs to
determine if it is a local variable reference or a call to a method
with no parameters. To decide which is the case, Ruby uses a heuristic.
As Ruby reads a source file, it keeps track of symbols that have been
assigned to. It assumes that these symbols are variables. When it
subsequently comes across a symbol that might be either a variable or a
method call, it checks to see if it has seen a prior assignment to that
symbol. If so, it treats the symbol as a variable; otherwise it treats
it as a method call. As a somewhat pathological case of this, consider
the following code fragment, submitted by Clemens Hintze."
def a
print "Function 'a' called\n"
99
end
for i in 1..2
if i == 2
print "a=", a, "\n"
else
a = 1
print "a=", a, "\n"
end
end
OUTPUTS >>
a=1
Function 'a' called
a=99
"During the parse, Ruby sees the use of ``a'' in the first print
statement and, as it hasn't yet seen any assignment to ``a,'' assumes
that it is a method call. By the time it gets to the second print
statement, though, it has seen an assignment, and so treats ``a'' as a
variable.
Note that the assignment does not have to be executed---Ruby just has
to have seen it. This program does not raise an error."
I tried the code above at the interactive Ruby 1.8.2 interpreter :
http://www.ruby.ch/tutorial/
2) Ruby does not have true first-class functions living in the same
namespace as other variables while Python does :
In Python :
def sayHello (name) :
return "Hello " + name
print sayHello("Mr. Bond")
m = sayHello
print m
print m("Miss Moneypenny")
OUTPUTS >>
Hello Mr. Bond
<function sayHello at 0x0102E870>
Hello Miss Moneypenny
In Ruby you need extra syntax that ruins the "first-class-ness" :
def sayHello (name)
return "Hello " + name
end
puts sayHello("Mr. Bond")
m = Class.method
puts m
puts m.call("Miss Moneypenny")
OUTPUTS >>
Hello Mr. Bond
#<Method: Class(Object)#sayHello>
Hello Miss Moneypenny
4) Conclusion
Since I did a lot of work in Scheme, rigor and consistency are most
important to me, and Python certainly meets this requirement.
--- Python newbie