Re: Anonymous multi-subs

[email protected] (yary)
Newsgroups perl.perl6.language
Message-ID <CAG2CFAbEKbrHATo=E1Xb+YGZQH-MVjxziUFgio62bri01-g1WQ@mail.gmail.com>
On Wed, Jun 24, 2015 at 7:17 PM, Brent Laabs <[email protected]> wrote:
I'll just note that you can fake anon multi subs with lexical subs like
this:

my $sub = do {
    proto foo (|) { * }
    multi foo (Int $x) { $x + 1 }
    multi foo (Str $y) { $y ~ 'a' }

    &foo;
}

say $sub("hello");

I like that, and I suspect it could be made generic (a routine that takes a
list of subs, returning a multi-sub) without too much difficulty.

The sub there is still named "foo" as attested by $sub.name, but isn't
> available under that name outside of the do block.
>

I've found named lambdas very useful when debugging (in Javascript). Having
$sub.name available is a feature as far as I'm concerned!


On Wed, Jun 24, 2015 at 5:27 PM, Jon Lang <[email protected]> wrote:

 Or, in the body, be able to examine the actual signature passed in and
> decide what to do based on that,  That [i]could[/i] be done using a
> given/when structure, which would be equivalent to a list of signature/body
> pairs.
>
>
That works, but it means re-doing what the dispatcher already does. Nicer
to hook into existing machinery.

Shortly after writing my last message I realized that a "*signature*, *body
*pair" is exactly a sub, and that what surprises me is that there isn't
already a constructor that returns a multi-sub, given a list of subs.

S06 says "proto is a generic wrapper around the dispatch to the multis" and
"A proto is a generic dispatcher, which any given scope with a unique
candidate list will instantiate into a dispatch routine" ... that's the
machinery to hook into. I'm thinking of them as roles or types, when really
they're attributes of Routine.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.