> Would a better approach be to create custom subtypes
of the built-in numeric types that mixin the algebraic roles?

It could maybe work out better to mix roles into numeric instances:

role G {
  has Numeric $numeric handles *;
  has ThreeDObject[:Rotation] $threedobject-rotation handles *;
  method G { "Gotta like groups" }
}
given 42 does G { say .G, .abs } # Gotta like groups42

Can you see something like that working out?

----

Maybe sweeten it up:

sub postfix:<G> (\obj) { obj does G }
given 42G { say .G, .abs } # Gotta like groups42

----

NB Declaring an op like that is SLOW. So make sure you're
declaring it just once per test run, not once per individual test.

It *kinda* worked to turn it into a macro to avoid the run-time hit:

use experimental :macros;
macro postfix:<G> (\obj) { quasi { {{{obj}}} does G } }
given 42G { say .G, .abs } # Gotta like groups42

but there's a warning displayed on stderr for the above.

----

Remember you can parameterize G:

role G[:$ass, :$ide, :$inv, :$com] { ... }
given 42 does G[:ass] { say .G, .abs } # Gotta like groups42

I'm not saying that makes any sense whatsoever for what
you want to do, but it seemed worth mentioning.

----

As another tip that may or may not be relevant, but one which is
far more wildly out-of-left-field than role parameterization, indeed
almost a non-sequitur in the context of this discussion, I've found
out that if a NON parameterized role has exactly one public attribute,
you can set its value as part of mixing in a role:

role foo { has $.bar }

given 42 does foo(99) { say .bar } # 99

----

Thoughts?

Reply via email to