Ashley Winters writes: > In S12, I see examples like: > > role Pet[Type $petfood = TableScraps] { > method feed (::($petfood) $food) {...} > } > > I assume that means lexicals declared as part of a parametric > specialization declaration block thingy are only visible within that > scope, like a formal subroutine parameter list?
Well, "like" is a pretty strong word, but it turns out not to be strong enough in this case. It *is* a formal parameter list. It just isn't on a sub. The brackets are there to be visually distinctive. We like declarations to look different from statements, and we like to know when we're messing with parametric types. > If so, are there things allowed (or disallowed) in type parameter > lists vs. sub parameter lists? Hmm... not that I can think of right off the bat. > If [] is enforcing long-name generation or something simple like that, > could I cheat and make it imply multi on my functions if I use it? > > sub foo[Int $x: Pair ?$y] {...} > sub foo[Pair $x, Pair $y] {...} > > Would that be valid/mean anything? I don't think you can do that. The brackets are kind of like C++'s templates, but not really. Since Perl is dynamic, they're not really saying anything is compile-time or anything like that. The brackets are just like the parentheses, except you use them with types. The big issue about these things that needs to be hashed out is type equivalence. When are two parameterized types the same one? When their arguments are exactly the same? What if the arguments don't know what equality is? What if you have multiple signatures for usability, but they map to the same logical type. Luke