A script language of time-sharing scheduling coroutine in single thread
Operator Overloading
Except three operators ($, ||, &&), the rest operators can be overloaded.
Overloading depends on a group of hook functions, their naming convention is:
__<type>_<optype>_operator__
type includes:
optype includes:
=+=-=<<=>>=*=/=|=&=^=%=|&^==!=<<=>>=<<>>+-*/%-- e.g. i--++ e.g. i++[].-~!++ e.g. ++i-- e.g. --iExample:
Sys = Import('sys');
@__int_cand_operator__(left, right)
{
Sys.print(left);
Sys.print(right);
return true;
}
sys.print((1 & 2));
This example will overload int operator & . The output is:
1
2
true
Which means the expression value is the return value of __int_cand_operator__.
Let’s change something:
Sys = Import('sys');
@__int_cand_operator__(left, right)
{
Sys.print(left);
Sys.print(right);
return left & right;
}
sys.print((1 & 2));
Now, the output is:
1
2
0
& in its hook functions will not be overloaded.
Operator overloading on object is a little bit different. Besides the way that shown above, the hook functions can be existed in Set definition.
Example:
Sys = Import('sys');
S {
attr;
@__obj_cand_operator__(&left, &right)
{
Sys.print(left);
Sys.print(right);
return true;
}
}
a = $S;
b = $S;
Sys.print((a & b));
The output is:
OBJECT
OBJECT
true
In this example, hook function __obj_cand_operator__ is given in a Set definition.
Another Example:
Sys = Import('sys');
S {
attr;
@__obj_cand_operator__(&left, &right)
{
Sys.print(left);
Sys.print(right);
return true;
}
}
@__obj_cand_operator__(left, right)
{
Sys.print(left);
Sys.print(right);
return false;
}
O {
attr;
}
a = $S;
b = $S;
c = $O;
d = $O;
Sys.print((a & b));
Sys.print((c & d));
The output is:
OBJECT
OBJECT
true
OBJECT
OBJECT
false
In this example, & between the objects of Set S will call the hook function defined in S, and Set O objects will triggered global function __obj_cand_operator__.