Operator overloading

João Eiras joao.eiras at gmail.com
Mon Dec 17 13:04:59 PST 2007


Hi all,

there's a feature in C++ which I like a lot, and I think it would be  
interesting to have in es4, which is operator overloading, like

   class X{ X& operator+(const X& x); }
   X a, b, c; c = a+b;

which allows the programmer to define a sum operation between two objects  
of type X.
The notation I'm using in this e-mail is just for example.
C++ allows to define all operators except :: (scope resolution), .  
(member) and .* (member through pointer)

To keep things clean, new operators cannot be defined (like in C++),so

   class X{ X& operator myop(const X& x); }
   X a, b, c; c = a myop b;

would be invalid.

Operators should only be defined as members of objects, so one cannot  
right a global operator function which picks up two object (alla C++), like
   function operator+:X(x:X,x:X);

Any global operator function like this one before would be added to the  
window, and would be equivalent to do
window['operator+']=function(x:X):X{}
because the 2nd argument would be ignored.

The following operators should be definable:
  - arithmetic: +  -  *  /  %  +=  -=  *=  /=  %=  ++  --
  - bitwise: &  |  ^  >>  <<  >>=  <<=  ~
  - boolean: ||  &&  !  ||=  &&=
  - others: typeof  ()  []

All these operators are binary except for |, ~ and typeof , so the left  
hand (A) object would be the context object, and the right hand object (B)  
would be the argument passed to the operator member in A. For unary  
operators, there won't be arguments, and the function would be called upon  
its target.
operator functions would only be called if the operator is explicitly used  
in the source code.

Now consider an example
   class X{
     function operator+:X(x:X);
     function operator typeof(){ return "function";};
   }
   var a:X := new X;
   var b:X := new X;

   var c:X = a + b; //sucess, operator is defined

   a += b; //error, no += operator defined

   var c:X = a + 1; //type-error, rhs must be of type X

   var tp:String = typeof a;//sucess, typeof operator is ALWAYS defined, by  
default it works as specified

alternative notation

   class X{}
   X['operator ~'] = function(){};...

Supporting all these operators in the spec can be somewhat awkward. So I  
wish for at least the typeof, () and [] operators to be defined.
This way one can build custom collections, which have the [] indexing  
operator.
Defining the () operator would fit the use case of IE and Opera (added for  
compatibility) which support the () operator as indexing operator in  
NodeLists.

What do you think ?

Thank you for your attention.




















More information about the Es4-discuss mailing list