develooper Front page | perl.perl6.users | Postings from January 2021

Re: A nextsame question

Thread Previous
Fernando Santagata
January 19, 2021 16:44
Re: A nextsame question
Message ID:
Thank you Vadim, your explanation makes a lot of sense!

On Tue, Jan 19, 2021 at 5:23 PM Vadim Belman <> wrote:

> Hello,
> By "never returns" it's not meant that nextsame redispatches to the next
> sub and skips the current stack frame. It only means that no statements
> following nextsame will be executed. It's the same semantics as with
> return. So, the best way to consider nextsame would be to think of it as of
> 'return next-candidate(...)'.
> I would say that this is the semantics which cares about the caller. If
> you put yourself in the shoes of your code user, imagine that you
> introspect the multi in question with 'cando' which gives you the candidate
> returning a List. It'd be very confusing to get an Int instead!
> Aside of this, the practice of returning so different values for rather
> similar arguments doesn't look good for me.
> Best regards,
> Vadim Belman
> On Jan 19, 2021, at 11:07 AM, Fernando Santagata <
>> wrote:
> Hello,
> I'm trying to understand how nextsame works.
> Apparently I started from the wrong assumptions: I thought that once the
> first matched sub in the chain called nextsame, the arguments were matched
> against the following subs regardless of the return value.
> It seems that while the return value is not taken in account during the
> match process, it is checked once the sub return its value and it generates
> an error if the two candidates in the chain have different return types.
> The documentation (
> reads:
> nextsame calls the next matching candidate with the same arguments that
>> were used for the current candidate and never returns.
> and doesn't mention the return value.
> proto test(Str $a, |) {*}
> multi test($a, Str $b --> List) {
>   nextsame if $b ~~ /\d+/;  # if the second string contains a number
>   return $a, $b
> }
> multi test($a, Int() $b --> Int) { return $b } # coerces the second
> argument to Int
> say test('hello', 1);           # output: 1
> say test('hello', 'goodbye');   # output: (hello goodbye)
> say test('hello', '1');         # error:  Type check failed for return
> value; expected List but got Int (1)
> Here I expected that in the third call, after the first multi matched, the
> nextsame triggered a match on the second multi, regardless of the return
> value. Instead apparently the match is triggered, but then the return value
> of the first multi (List) is expected from the second multi (which returns
> an Int).
> I don't know if this is the desired behavior; if so probably it deserves
> to be documented.
> --
> Fernando Santagata

Fernando Santagata

Thread Previous Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About