Multiple return values in Perl is pretty cool, and I miss that sometimes when using other languages. Well, Perl 6 takes the idea to an extreme. I explored the concept in some detail and synthesized Returning Multiple Values. I'm interested in comments.

—John

Replies are listed 'Best First'.
Re: [Perl 6] Returning Multiple Values
by hexcoder (Curate) on Aug 09, 2008 at 09:58 UTC
    Thanks, exiting stuff!

    Here is what I found, when trying to parse it.

    near the end of first section All functions return a Capture before the summary:
    s{re-capures}{re-captures}xms

    next sentence:
    in mean one of \( $ foo )) the braces don't match.

    In section Passing values out of the function, second code clock:
    one additional sentence about PRE would be nice (a precondition probably).

    In section Accepting values returned to you, second code block:
    my (Str $y, Int $x) := ret-test'(4),  # ($y,$x) gets (1,'Smith'), WRONG
    statement ends with a comma instead of a semicolon.

    Something here is wrong with the first and third call
    my (Str $y, Int $x) := ret-test'(5);  # y=>'Smith', x=>1, so OK versus
    my (Str $y, Int $x) := ret-test'(5);  # ($x,$y) gets (1,'Smith'), WRONG
    because the same invocation cannot be OK and WRONG at the same time, I think.

    Also see second and forth invocation, the comments of both lines contradict each other. First y gets 1, then x gets 1
    my (Str $y, Int $x) := ret-test'(4),  # ($y,$x) gets (1,'Smith'), WRONG
    versus
    my (Str $y, Int $x) := ret-test'(4);  # ($x,$y) gets (1,'Smith'), WRONG

    The comments of the third and forth call reverse the order of x and y compared to the first two invocations.

      Many thanks. The last things you found were due to copy-paste of the lines without removing the PRIME from the function name. I intended to show that the function with the signature behaves differently than the same function body without the signature.

      Thanks for the close reading. After a while all those commas and stuff just blur together for me.

      —John

        You're welcome!

        I saw your corrections, but there is one point left I think.

        In section Accepting values returned to you in the first invocation using ret-test'(5) the result of ($x gets 1 and $y gets 'Smith') is OK (according to the comment),

        my (Str $y, Int $x) := ret-test'(5); # y=>'Smith', x=>1, so OK
        then in the third invocation the same result (as the comment suggests) is WRONG.
        my (Str $y, Int $x) := ret-test(5); # ($x,$y) gets (1,'Smith'), WRONG
        So i assume it is WRONG but the comment has $x and $y (or the list values) swapped. And probably the same for the forth invocation.