Method `^()
- Method
`^
mixed
`^(mixed
arg1
)
mixed
`^(mixed
arg1
,mixed
arg2
,mixed
...extras
)
mixed
`^(object
arg1
,mixed
arg2
)
mixed
`^(mixed
arg1
,object
arg2
)
int
`^(int
arg1
,int
arg2
)
string
`^(string
arg1
,string
arg2
)
array
`^(array
arg1
,array
arg2
)
mapping
`^(mapping
arg1
,mapping
arg2
)
multiset
`^(multiset
arg1
,multiset
arg2
)
type
`^(program
|type
arg1
,program
|type
arg2
)- Description
Exclusive or.
Every expression with the
^
operator becomes a call to this function, i.e.a^b
is the same aspredef::`^(a,b)
.- Returns
If there's a single argument, that argument is returned.
If there are more than two arguments, the result is:
`^(`^(
.arg1
,arg2
), @extras
)Otherwise, if
arg1
is an object with an lfun::`^(), that function is called witharg2
as argument, and its result is returned.Otherwise, if
arg2
is an object with an lfun::``^(), that function is called witharg1
as argument, and its result is returned.Otherwise the result depends on the argument types:
arg1
can have any of the following types:int
Bitwise exclusive or of
arg1
andarg2
.string
The result is a string where each character is the bitwise exclusive or of the characters in the same position in
arg1
andarg2
. The arguments must be strings of the same length.array
The result is an array with the elements in
arg1
that doesn't occur inarg2
concatenated with those inarg2
that doesn't occur inarg1
(according to `>, `< and `==). The order between the elements that come from the same argument is kept.Every element is only matched once against an element in the other array, so if one contains several elements that are equal to each other and are more than their counterparts in the other array, the rightmost remaining elements are kept.
mapping
The result is like
arg1
but with the entries fromarg1
andarg2
whose indices are different between them (according to hash_value and `==).multiset
The result is like
arg1
but with the entries fromarg1
andarg2
that are different between them (according to `>, `< and `==). Subsequences with orderwise equal entries (i.e. where `< returns false) are handled just like the array case above.type
|program
The result is a type computed like this:
(
.arg1
&~arg2
)|(~arg1
&arg2
)The function is not destructive on the arguments - the result is always a new instance.
- Note
If this operator is used with arrays or multisets containing objects which implement lfun::`==() but not lfun::`>() and lfun::`<(), the result will be undefined.
- See also