Austin Ziegler wrote:

>I don't actually see this (that everything is "almost" an object).
>Personally, I think that matz has made the right choice in making
>boolean operations (and, &&, or, ||) invariant in the language. You
>can, by the way, redefine the bit operators (& and |). There's
>nothing worse than a language which doesn't do what you expect it to
>do with conditionals, and it does so on the whim of another
>programmer.
>  
>
Ok, you are right, it's Mr. Matz decission, but, why then can I redefine 
the  "and" method ? It must be a method in the very first time, not an 
exception.

>>Why is not "=" a method?
>>    
>>
>
>Because it's not something done to objects, but to reference
>variables that we use to manipulate objects. I'm really curious as
>to why one would want to redefine assignment in the first place. I
>mean, seriously. It's not like this is C++ where you have to
>reinvent everything every time you work with the bloody language.
>  
>
It's not a question to redefine the "=" operator it's a question of 
orthogonality, what you learn for one thing is equally applicable to 
other parts of the language, it's interesting some times to have the 
option to redefine the equal operator, but in most of the cases doing so 
is adding a real complexity to the understanding of the program, this 
does not means, that if you need to do it you can

>>Same question for "and" and the rest of operators that can not be
>>redefined, Does the actual implementation make life easier for the
>>designer ? I say so because for me is more natural when everything
>>is an object (without exceptions, here Ruby follows the rule
>>pretty well) and a method is a method ever, not sometimes.
>>    
>>
>
>This is just MNSHO, but again I don't see why one would want to
>allow such basic constructs to be redefined. IMO, you can redefine
>everything except boolean tests and still have a useful -- if obtuse
>-- language; if you try to redefine those, you're not going to be
>able to have any determinacy with the programs that are written.
>  
>
You can...

class TrueClass
  def and (anArgument)
    return "hello"
  end
end

I've redefined the and, it does not work, but it does not generate any 
warning or error...

>Why is it necessary to access the primitives? IMO, Java's biggest
>problem is that it makes the primitives available. In Ruby, by the
>way, I can still change the behaviour of String -- this is where
>Ruby differs from every other language that I've ever used: it's
>dynamic. If I need a new function on String, I can add it whenever I
>need. I'm looking at extending the functionality of a library that
>I've ported so that it can optionally extend String and Array to
>include this library as methods on String and Array instead of as
>something else to operate on a String or an Array.
>  
>
Yes it's not needed, in Basic, you can not access the primitives and the 
language is still working, but Ruby is much more powerful and flexible, 
not because you can access the primitives, but because the language 
gives you more options. The primitive access is just another option.

Consider for example the string extension you want

class String
  def strExtension
    call libStrgExtension.o:110
  end
end

It's not this way much more easy  to do?

>>Yes you can have the "required" clause and use binary libraries,
>>but would not be much more "natural" to have a "require string"
>>when you want to invoque string libraries instead of having them
>>loaded all the time ?. I want to say here that the "primitive"
>>keyword frees the language from it's implementation. This favours
>>the everything is a module aproach.
>>    
>>
>
>I disagree -- allowing access to the primitives ties the developer
>very tightly to the local implemententation of the language. I don't
>particularly care whether or not my integers are 32-bit or 64-bit or
>even larger -- I just expect them to do what they should do (and
>that means possibly upclassing to a BigNum class if I exceed the
>word size). I think that the only thing that I'd like to see in this
>regard is for Ruby to take a page from Ada and allow me to define
>ranges as types (that is, I want to be able to automatically define
>a class UInt64 < Integer [(-2**64) .. (2**64 - 1)] and have it do
>the Right Thing).
>

Ok, you have a good point here. Ruby now deals with primitives, and you 
don't care if the Integer is 32 or 64 bits, it's just an integer, you 
can care of their limits only.  Any development using explicit 
primitives are not going to change this

class Integer   # In a 32 bit environment
  def sqrt
    call libRubyMath.o:110
  end
end

class Integer   # In a 64 bit environment
  def sqrt
    call libRubyMath.o:110
  end
end

Oh!!! it's the same !!!, Why there is no diference ? because Ruby is 
tied to the environment where it is working, as happens now, you invoque 
ruby from the command line and you don't care if the system is 32 or 64 
bits, you make now primitive calls implicitly, as much as you don't care 
if the system is Linux or Windows (ok, without using plattform extensions)

>It would NOT be much more natural to require every bloody module I
>need every time I need it. A language -- especially a language like
>Ruby, where Strings are fundamental to everything -- isn't useful
>without certain defaults. Would it not make equal sense to "require
>integer" when I need to use integers, or are you suggesting that
>those are fundamentals and are always included? Strings are part of
>what makes Ruby useful immediately (the same applies to Files)
>because it's a scrpiting language.
>  
>
I did put "String" as an example, but in fact the only needed module is 
"kernel", the base of the language, where Object, Boolean, and Magnitude 
 are defned (in Ruby there is no Boolean class and no Magnitude, but you 
have Fixnum and TrueClass and FalseClass, I think that this is going to 
change in the future). The rest are extensions, what an OO language is 
supposed to deal with.

>I'm sorry, but I don't understand what you're getting at here. The
>three examples you gave:
>
>  a.+(3)
>  a.+ 3
>  a + 3
>
>are actually the only ways to express that thought (without getting
>silly wrt parenthesis). Ruby explicitly makes parentheses optional
>on method calls. Parentheses make complex operations easier to read,
>certainly, and can prevent confusion for the interpreter and
>programmer, as when you have:
>
>  a b, c d
>    // Is this a(b, c(d)) -- OR
>    //         a(b), c(d)
>
>This means only that "a + 3" is syntactic sugar for "a.+(3)" because
>it is fundamentally more natural for most people to write "a + 3"
>than either "a.+(3)" or even RPN "a 3 +". Again, matz has made the
>proper choice -- it keeps the language easily accessible.
>  
>
You will like then the Perl's "there is a hundred ways to do it" 
slogan.. :-)

The fact that there is more than one way to express something, weakens 
the mastery of the language. It's right sometimes becasue it makes 
things so "eye sugar" , but I prefer ( I PREFER, it's me, my  option) a 
one way to do things, it makes things easy to code and easy to read your 
own code and the one made by others.

>Actually, it can't give you the same results without trouble. C++
>*is* trouble because it allows the definition of:
>
>  a = a + b     // a.=(a.+(b))
>
>to be different from:
>
>  a += b        // a.+=(b)
>
>If the result of the first call isn't the same as the result of the
>second call, then there's a disconnect which has to be documented.
>Matz made the right choice here, I think, because it prevents this
>sort of stupidity that C++ allows. (And this isn't 'prevention' in
>the way that I think GvR was beyond silly to require indentation for
>block definition in Python.)
>  
>
I disagree, You loose flexibility, it does not mean that you need to use 
it, it means that you have the flexibility there when you need it.

Anyways, if I define a.+=b to be diferent from a.=a.+b it's my own fault 
for using  bad semantincs, but it can be posible that someone must be 
interested in having side efects associated with the += operator (as in 
C++, and yes it's troublesome). In Smalltalk you can do it and there are 
no problems with the added flexibility, contrary to C++ where a lot of 
programmers started to do OOP without a solid background on OO analisys, 
this bring us the problems with C++

>The interpreter will warn you of this, to some degree. If I try to
>use an undefined variable, it will complain (at least with 1.7)
>because the value is unknown (it's not even properly 'nil'). This
>won't help, however, if you have two similarly named variables.
>  
>
OK, I'll try...I'm using Linux with 1.6. Anyways a warning would be a 
great addition, you will catch the error at compile time instead of at 
run-time.

>This one is easy: because it was a design decision made earlier. A
>new version of String is being worked on, to the best of my
>knowledge, that will deal with characters -- but this leaves the
>problem of existing code which will break because it uses the
>current implementation.
>  
>
It does not need to break nothing a character is an integer with a dual 
personality, maybe you will just need to redefine some methods based on 
the arguments, but I don't foresee serious problems.

>A bytecode system is being worked on, to the best of my knowledge.
>  
>
Someone pointed me to Parrot, I've done him just a look, and it's 
interesting.

Enric