Skip to content

Instantly share code, notes, and snippets.

@fecundf
Created August 23, 2020 20:17
Show Gist options
  • Save fecundf/bfc617a2b3bfd2f6096afaf52795eedc to your computer and use it in GitHub Desktop.
Save fecundf/bfc617a2b3bfd2f6096afaf52795eedc to your computer and use it in GitHub Desktop.
Work in progress about Raku traits leaking when more than one applied, maybe.
#!/usr/bin/env raku
use v6;
use Test;
multi trait_mod:<is> (Routine \routine, :$equality-A!) {
trait_mod:<is>(routine, :equiv(&infix:<==>));
}
multi trait_mod:<is> (Routine \routine, :$equality-B!) {
trait_mod:<is>(routine, :equiv(&infix:<==>));
}
multi trait_mod:<is> (Routine \routine, :$equality-C!) {
trait_mod:<is>(routine, :equiv(&infix:<==>));
}
multi trait_mod:<is> (Routine \routine, :$chainable-A!) {
trait_mod:<is>(routine, :assoc<chain>);
}
multi trait_mod:<is> (Routine \routine, :$chainable-B!) {
trait_mod:<is>(routine, :assoc<chain>);
}
multi trait_mod:<is> (Routine \routine, :$chainable-C!) {
trait_mod:<is>(routine, :assoc<chain>);
}
multi trait_mod:<is> (Routine \routine, :$eq-chain-A!) {
trait_mod:<is>(routine,:equality-A);
trait_mod:<is>(routine,:chainable-A);
}
# No declaration of eq-chain-B on purpose
multi trait_mod:<is> (Routine \routine, :$eq-chain-C!) {
trait_mod:<is>(routine,:equality-C);
trait_mod:<is>(routine,:chainable-C);
}
sub is-eq-A is equality-A { ... }
sub is-eq-B is equality-B { ... }
sub is-eq-C is equality-C { ... }
sub chained-A is chainable-A { ... }
sub chained-B is chainable-B { ... }
sub chained-C is chainable-C { ... }
BEGIN my (\orig-eq-A-prec-clone, \orig-chained-A-prec-clone, \orig-eq-A-prec, \orig-chained-A-prec) =
&is-eq-A.prec.clone, &chained-A.prec.clone,&is-eq-A.prec, &chained-A.prec;
my \postcompiled-eq-A-prec-clone = &is-eq-A.prec.clone;
my \postcompiled-chained-A-prec-clone = &chained-A.prec.clone;
sub is-eq-is-chained-B is equality-B is chainable-B { ... }
sub trait_mod-eq-chain-C is eq-chain-C { ... }
plan 15;
is-deeply orig-eq-A-prec-clone, postcompiled-eq-A-prec-clone, 'orig-eq-A-prec-clone eqv postcompiled-eq-A-prec-clone';
is-deeply orig-eq-A-prec-clone, orig-eq-A-prec, 'ok $orig-eq-A-prec-clone eqv $orig-eq-A-prec';
is-deeply orig-eq-A-prec-clone, &is-eq-A.prec, '$orig-eq-A-prec eqv &is-eq-A.prec';
is-deeply orig-chained-A-prec-clone, postcompiled-chained-A-prec-clone, 'orig-chained-A-prec-clone chainedv postcompiled-chained-A-prec-clone';
is-deeply orig-chained-A-prec-clone, orig-chained-A-prec, 'ok $orig-chained-A-prec-clone chainedv $orig-chained-A-prec';
is-deeply orig-chained-A-prec-clone, &chained-A.prec, '$orig-chained-A-prec chainedv &is-chained-A.prec';
is-deeply &is-eq-A.prec, &is-eq-B.prec, '&is-eq-A.prec eqv &is-eq-B.prec';
is-deeply &is-eq-A.prec, &is-eq-C.prec, '&is-eq-A.prec eqv &is-eq-C.prec';
is-deeply &chained-A.prec, &chained-B.prec, '&chained-A.prec eqv &chained-B.prec';
is-deeply &chained-A.prec, &chained-C.prec, '&chained-A.prec eqv &chained-C.prec';
is-deeply &is-eq-is-chained-B.prec, &trait_mod-eq-chain-C.prec, '&is-eq-is-chained-B.prec eqv &trait_mod-eq-chain-C.prec';
ok &is-eq-is-chained-B.prec !eqv &is-eq-B.prec, '&is-eq-is-chained-B.prec !eqv &is-eq-B.prec';
ok &is-eq-is-chained-B.prec !eqv &chained-B.prec, '&is-eq-is-chained-B.prec !eqv &chained-B.prec';
ok &trait_mod-eq-chain-C.prec !eqv &is-eq-C.prec, '&trait_mod-eq-chain-C.prec !eqv &is-eq-C.prec';
ok &trait_mod-eq-chain-C.prec !eqv &chained-C.prec, '&trait_mod-eq-chain-C.prec !eqv &chained-C.prec';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment