What does this mean?

our sub outer ()
  {
   ...
   our sub inner () { ... }
  }


inner;  # defined?

I think this should be illegal. Nested named subs makes sense for 'my', with the rules of visibility matching the ability to clone the closure. But putting the nested sub into package scope is nonsense. It's really a different clone every time outer is called, and doesn't make sense to call unless outer is already pending.

If inner doesn't actually need anything from outer's block scope, then there is no reason to declare it nested. If you have something specific in mind, like creating specific clones on the fly, then the code in outer can explicitly post the version it creates to the package scope and make it clear exactly when it's being created.

E.g.

our sub outer (::T $x)
  {
   # explicitly create a new multi with every specialization
   state %didit;
   unless ++ %didit{ $x.HOW } {
      my multi sub inner (T $x)  {  ... }
      Package::<&inner> = &inner;
     }
  }


If anyone wants to show the proper syntax for doing that, I'd appreciate it.


--John

Reply via email to