5Operator
5.1Overview
There are three types of Operators.
- Prefixed Unary Operator takes an input value specified after it.
- Suffixed Unary Operator takes an input value specified before it.
- Binary Operator takes two input values specified on both sides of them.
An Operator has a table of procedures that are indexed by Data Types of given values, one Data Type indexing for Unary Operators and two Data Types for Binary Operators. For instance, operator +
has a procedure to calculate between values of number
and number
and also a procecure beween values of string
and string
. These procedures are isolated each other as long as combination of the given Data Types is different.
Users can overload operators' procedures through operator
instance. If combination of Data Types of the overloading procedure is the same as that of existing one, it would override the registered procedure. Otherwise, it would add a new procedure to the operator.
5.2Precedence
The following table shows operators' precedence order from the lowest to the highest.
Precedence | Operators |
---|---|
Lower |
=> |
|| |
|
&& |
|
! |
|
in |
|
< > <= >= <=> == != |
|
.. |
|
| |
|
^ |
|
& |
|
<< >> |
|
+ - |
|
* / % ? |
|
~ |
|
Higher |
** |
5.3Calculation Operators
Basically, Operators are used for mathematical and logical calculation. This subsection explains such functions of operators.
5.3.1Prefixed Unary Operators
Operation +x
returns the value of x
itself.
Operation | Result Data Type |
---|---|
+number |
number |
+complex |
complex |
+rational |
rational |
+array |
array |
+timedelta |
timedelta |
Operation -x
returns a negaive value of x
.
Operation | Result Data Type |
---|---|
-number |
number |
-complex |
complex |
-rational |
rational |
-array |
array |
-timedelta |
timedelta |
Operation ~x
returns a bit-inverted value of x
.
Operation | Result Data Type |
---|---|
~number |
number |
Operation !x
returns a logically inverted value of x
after evaluating it as a boolean value.
Operation | Result Data Type |
---|---|
!any |
boolean |
5.3.2Suffixed Unary Operators
Operation x..
returns an infinite iterator that starts from x
and is increased by one.
Operation | Result Data Type |
---|---|
number.. |
iterator |
Operation x?
returns false
if x
is false
or nil
, and true
otherwise. This operator is not affected by Implicit Mapping and returns true
if x
is of list
or iterator
type.
Operation | Result Data Type |
---|---|
any? |
boolean |
5.3.3Binary Operators
Operation x + y
returns an added result of x
and y
.
Operation | Result Data Type |
---|---|
number + number |
number |
number + complex |
complex |
number + rational |
rational |
complex + number |
complex |
complex + complex |
complex |
complex + rational |
(error) |
rational + number |
rational |
rational + complex |
(error) |
rational + rational |
rational |
array + array |
array |
datetime + timedelta |
datetime |
timedelta + datetime |
datetime |
timedelta + timedelta |
timedelta |
If x
and y
are of string
or binary
type, Operation x + y
returns concatenated result of x
and y
.
Operation | Result Data Type |
---|---|
string + string |
string |
binary + binary |
binary |
string + binary |
binary |
binary + string |
binary |
string + any |
string (`any` will be converted to `string` before concatenation) |
any + string |
string (`any` will be converted to `string` before concatenation) |
Operation x - y
returns a subtracted result of x
and y
.
Operation | Result Data Type |
---|---|
number - number |
number |
number - complex |
complex |
number - rational |
rational |
complex - number |
complex |
complex - complex |
complex |
complex - rational |
(error) |
rational - number |
rational |
rational - complex |
(error) |
rational - rational |
rational |
array - array |
array |
datetime - timedelta |
datetime |
datetime - datetime |
timedelta |
timedelta - timedelta |
timedelta |
Operation x * y
returns a multiplied result of x
and y
.
Operation | Result Data Type |
---|---|
number * number |
number |
number * complex |
complex |
number * rational |
rational |
complex * number |
complex |
complex * complex |
complex |
complex * rational |
(error) |
rational * number |
rational |
rational * complex |
(error) |
rational * rational |
rational |
array * array |
array |
timedelta * number |
timedelta |
number * timedelta |
timedelta |
Applying *
operator between string
/binary
and number
will join the string
/binary
for number
times.
Operation | Result Data Type |
---|---|
string * number |
string |
number * string |
string |
binary * number |
binary |
number * binary |
binary |
Operation x / y
returns a divided result of x
and y
.
Operation | Result Data Type |
---|---|
number / number |
number |
number / complex |
complex |
number / rational |
rational |
complex / number |
complex |
complex / complex |
complex |
complex / rational |
(error) |
rational / number |
rational |
rational / complex |
(error) |
rational / rational |
rational |
array / array |
array |
Operation x % y
returns a remainder after dividing x
by y
.
Operation | Result Data Type |
---|---|
number % number |
number |
Operation x ** y
returns a powered result of x
and y
.
Operation | Result Data Type |
---|---|
number ** number |
number |
number ** complex |
complex |
complex ** number |
complex |
complex ** complex |
complex |
Operation x == y
returns true
when x
equals to y
, and false
otherwise.
Operation | Result Data Type |
---|---|
any == any |
boolean |
Operation x < y
returns true
when x
is less than y
, and false
otherwise.
Operation | Result Data Type |
---|---|
any < any |
boolean |
Operation x > y
returns true
when x
is greater than y
, and false
otherwise.
Operation | Result Data Type |
---|---|
any > any |
boolean |
Operation x <= y
returns true
when x
is less than or equal to y
, and false
otherwise.
Operation | Result Data Type |
---|---|
any <= any |
boolean |
Operation x >= y
returns true
when x
is greater than or equal to y
, and false
otherwise.
Operation | Result Data Type |
---|---|
any >= any |
boolean |
Operation x <=> y
returns 0
when x
is equal to y
, -1
when x
is less than y
and 1
when x
is greater than y
.
Operation | Result Data Type |
---|---|
any <=> any |
number |
Operation x in y
checks if x
is contained in y
.
When Operator in
takes a value of any type other than list
and iterator
at its left, it will check if the value is contained in the container specified at its right. If the right value is not of list
or iterator
, it would act in the same way as Operator ==
.
Operation | Result Data Type |
---|---|
any in list |
boolean |
any in iterator |
boolean |
any in any |
boolean |
When Operator in
takes a value of list
or iterator
type at its left, it will check if each value of the container's element is contained in the container specified at its right, and return a list of boolean
indicating the result of each containing check.
Operation | Result Data Type |
---|---|
list in list |
list |
list in iterator |
list |
list in any |
list |
iterator in list |
list |
iterator in iterator |
list |
iterator in any |
list |
When Operator in
is used in an argument of for()
and cross()
function, it would work as an iterable assignment. See Chapter.8. Flow Control for detail.
Operation x & y
returns an AND calculation result of x
and y
.
- If
x
andy
are ofnumber
type, it calculates bitwise AND between them. - If
x
andy
are ofboolean
type, it calculates logical AND between them. - If either
x
ory
isnil, it returns
nil.
Operation | Result Data Type |
---|---|
number & number |
number |
boolean & boolean |
boolean |
nil & any |
nil |
any & nil |
nil |
Operation x | y
returns an OR calculation result of x
and y
.
- If
x
andy
are ofnumber
type, it calculates bitwise OR between them. - If
x
andy
are ofboolean
type, it calculates logical OR between them. - If either
x
ory
isnil, it returns one of their values that is not
nil.
Operation | Result Data Type |
---|---|
number | number |
number |
boolean | boolean |
boolean |
nil | any |
nil |
any | nil |
nil |
Operation x ^ y
returns a XOR calculation result of x
and y
.
- If
x
andy
are ofnumber
type, it calculates bitwise XOR between them. - If
x
andy
are ofboolean
type, it calculates logical XOR between them.
Operation | Result Data Type |
---|---|
number ^ number |
number |
boolean ^ boolean |
boolean |
Operation x << y
returns a value of x
shifted left by y
bits.
Operation | Result Data Type |
---|---|
number << number |
number |
Operation x >> y
returns a value of x
shifted right by y
bits.
Operation | Result Data Type |
---|---|
number >> number |
number |
Operation x && y
returns a conditional AND result of x
and y
as described below:
- If
x
is not oflist
noriterator
type, it would return the value ofx
whenx
is determined asfalse
, and return the value ofy
otherwise. It won't evaluatey
whenx
comes out to be infalse
state. - If
x
is oflist
type, it applies the above operation on each value of the list's elements and returns a list containing the results. - If
x
is ofiterator
type, it returns an iterator that is to apply the above operation on each value of the iterator's elements.
Operation | Result Data Type |
---|---|
any && any |
any |
list && any |
list |
iterator && any |
iterator |
Operation x || y
returns a conditional OR result of x
and y
as described below:
- If
x
is not oflist
noriterator
type, it would return the value ofx
whenx
is determined astrue
, and return the value ofy
otherwise. It won't evaluatey
whenx
comes out to be intrue
state. - If
x
is oflist
type, it applies the above operation on each value of the list's elements and returns a list containing the results. - If
x
is ofiterator
type, it returns an iterator that is to apply the above operation on each value of the iterator's elements.
Operation | Result Data Type |
---|---|
any || any |
any |
list || any |
list |
iterator || any |
iterator |
Operation x..y
creates an iterator that returns number
value that starts from x
and is increased by one until y
.
Operation | Result Data Type |
---|---|
number..number |
iterator |
Operation x => y
returns a list [x, y]
.
Operation | Result Data Type |
---|---|
number => any |
list |
string => any |
list |
symbol => any |
list |
When Operator =>
is used in an argument declaration of any function definition, it would work as an assignment for a default value. And, when it is used in an argument list of any function call, it would work as a named argument. See Chapter.7. Function for their detail.
5.4Other Operators
Operation string % any
returns a result formatted by the string containing specifiers of printf
format. The value of any
must be a list if more than one argument are necessary.
'Name: %s, Age: %d' % [name, age]
The code above has the same result as the following.
format('Name: %s, Age: %d', name, age)
Operation function * any
applies the function on any
.
Operation stream << any
outputs any
to the stream
.
sys.stdout << 'Hello World\n'
5.5Operator Overload
You can assign your own functions to operators through operator
instance. The example below assings string - string
operation by using operator#assign()
method.
op = operator(`-)
op.assign(`string, `string) {|x, y|
x.replace(y, '')
}
After this assignment, the following code results in 'Hello, world'
.
'Hello, 1234world' - '1234'
If you want to assign a function of a unary operator, specify one argument in operator#assign()
method like below.
op = operator(`-)
op.assign(`string) {|x|
x.each().reverse().join()
}
Then, the code below has a result '987654321'
.
-'123456789'
You can also override existing operators.
You can use operator#entries()
method to get all of the functions registered in the operator.
op = operator(`-)
println(op.entries())
The method returns entries registered as binary operators. Specifying a symbol `unary
as its argument would return a list of unary operators.
op = operator(`-)
println(op.entries(`unary))