If they allowed FORTH it would be even worse -- everything in FORTH is redefinable -- you could make 1 equal to 2 if you want.
https://www.forth.com/embedded/#Annotated_example_source_cod... contains a version of the canonical washing machine program.
\ Top-level control
: WASHER ( -- ) WASH SPIN RINSE SPIN ;
You can then look at the definitions for 'WASH' and 'SPIN' and 'RINSE' and so on until you get down to what IO bits you're turning on or reading when and for how long. $ irb
2.4.1 :001 > 1.class
=> Integer
2.4.1 :002 > class Integer
2.4.1 :003?> def 1
2.4.1 :004?> 2
2.4.1 :005?> end
2.4.1 :006?> end
SyntaxError: (irb):3: syntax error, unexpected tINTEGER
def 1
^
(irb):6: syntax error, unexpected keyword_end, expecting end-of-input
That's not unexpected as small numeric literals are magic in Ruby, for performance reasons.More evidence:
2.4.1 :001 > class Integer
2.4.1 :002?> define_method(:one) { 1 }
2.4.1 :003?> end
=> :one
2.4.1 :004 > Integer.one
NoMethodError: undefined method `one' for Integer:Class
2.4.1 :005 > Integer.new.one
NoMethodError: undefined method `new' for Integer:Class
2.4.1 :006 > Integer.new
NoMethodError: undefined method `new' for Integer:Class
2.4.1 :007 > class Klass
2.4.1 :008?> define_method(:one) { 1 }
2.4.1 :009?> end
=> :one
2.4.1 :010 > Klass.one
NoMethodError: undefined method `one' for XY:Class
2.4.1 :011 > Klass.new.one
=> 1
So Integer is not like other classes and the actual reason for that http://archive.oreilly.com/pub/post/the_ruby_value_1.htmlTLDR MRI gets the value of the number directly from value of the C pointer and saves the lookup. It's a 1 in the lowest bit and the integer value in the others. That's why 0.object_id == 1, 1.object_id == 3, etc
Obviously that's implementation dependent but I guess no Ruby implementation is going us to redefine integers if MRI does not.