Inequality
As stated before, I like to read code I didn’t write myself. Flavio had trouble with triples. One line stood out to me.
take @triple if $N == @triple.any;
This looks like a setoperation to me. But using $N ∈ @triple
dropped one result. After some debugging I found the culprit.
.map({($_, $n / $_)}); # take it and its counterpart
This might look like a division but is actually a type cast to Rat
.
say 1 ∈ (1/1, );
# OUTPUT: False
Rakudo implements setoperations as equivalence checks, not numerical equality. Quite in contrast to ==
, eqv
does a type check and Int
aint’t Rat
. This might explain that the mathematical inclined don’t use Set
as much as I did expect them to. The type mismatch simply produces a result that is not useful to mathematicians.
As implemented right now, we can’t tell the set operators what we consider equality . With metaoperators and junctions, we can specify what operator we actually want to use. The setoperators are not metaoperators and at least for now, we can’t user define new metaoperators. However, we can lexically redefine ordinary operators.
proto sub infix:<(elem)>($, $, *% > Bool:D) is pure {*}
multi sub infix:<(elem)>(Numeric:D \a, Iterable:D \listy > Bool:D) {
Any.failiteratorcannotbelazy('∈', '') if listy.islazy;
for listy > \b {
return True if a == b;
}
False
}
constant &infix:<∈> := &infix:<(elem)>;
proto sub infix:<(&)>() is pure {*}
multi sub infix:<(&)>(Iterable:D \lhs, Iterable:D \rhs) {
Any.failiteratorcannotbelazy('∩', '') if lhs.islazy  rhs.islazy;
my @result;
for lhs > \l {
for rhs > \r {
@result.push: r if l == r;
}
}
+@result ?? @result !! ∅
}
constant &infix:<∩> := &infix:<(&)>;
say 1 ∈ (1/1, );
say (42, 42/2, 42/3) ∩ (1, 21, 3);
# OUTPUT: True
# Set(21)
The proto
is needed, because we need to get rid of multicandidates that are already present. A more general approach might be to have a &*SETCOMPARATOR
that defaults to &infix:<cmp>
. This would slow down a fairly simple operator by a factor of 13. I may still be able to write a module that takes a comparator and returns a host of operators. With proper macros this would be easy. Maybe next year.
For now I shall be evil and report back with success.

August 16, 2021 at 16:082021.33 Cucumbering – Rakudo Weekly News

August 23, 2021 at 14:262021.34 Stabler – Rakudo Weekly News