• Subject: Re: How do you return multiple values?
• From: Patrick Donnelly <batrick@...>
• Date: Wed, 4 Nov 2009 15:35:14 -0500

```On Wed, Nov 4, 2009 at 3:24 PM, Geoff Leyland <geoff_leyland@fastmail.fm> wrote:
> Thanks Roberto,
>
> On 5/11/2009, at 9:09 AM, Roberto Ierusalimschy wrote:
>
>>> How do you return multiple values from a function that pcalls a function
>>> that returns an unknown number of values possibly including nil in a
>>> manner that doesn't involve undefined behaviour?
>>>
>>> [...]
>>>
>>> function b()
>>>  local status, r = pcall(function() return { a() } end)
>>>  if not r then error("nicely handled error!") end
>>>  return unpack(r)
>>> end
>>>
>>> [...]
>>
>>
>> function pack (...)
>>  return { n = select("#", ...); ... }
>> end
>>
>> function b()
>>  local r = pack(pcall(function() return { a() } end))
>>  if not r[1] then error("nicely handled error!") end
>>  return unpack(r, 2, r.n)
>> end
>>
>> ?
>
>
> Excuse me for causing confusion by writing "if not r" where I meant "if not
> status", and for the case of what I *meant*, it'd be
>
> local status, r = pcall(function() return pack(a()) end)
> if not status [...]
>
> It has the advantage over Florian's that you only write pack once and you
> handle the error in b(), not in the helper function, whereas Florian's
> avoids the packing and unpacking.  I think they have the same number of
> closures?
>
> Anyway, thanks to you both!

Use:

function b()
local t = pack(pcall(a));
if not r[1] then error("something") end
return unpack(r, 2, r.n)
end

(this is what Roberto's code meant to be I think)

Note there is no closure cost here.

--
-Patrick Donnelly

"Let all men know thee, but no man know thee thoroughly: Men freely
ford that see the shallows."

- Benjamin Franklin

```