lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Tue, Sep 30, 2014 at 4:05 PM, Tom N Harris <telliamed@whoopdedo.org> wrote:
> On Tuesday, September 30, 2014 01:02:37 PM Coda Highland wrote:
>> No, the goto B is skipping over the normal control flow to continue
>> execution at the label. Think of it more like an exception than a
>> coroutine:
>>
>> function A()
>>   local N=0
>>   local C=function()
>>     N=N+1
>>     error("goto B")
>>   end
>>   pcall(function() N=1+C() end)
>>   -- ::B:: goes here
>>   return N
>> end
>> print(A())
>>
>
> I could also rewrite it this way:
>
>     function A()
>       local N=0
>       local B=function() return N end
>       local C=function()
>         N=N+1
>         return B()
>       end
>       N=1+C()
>       return B()
>     end
>
> A tail call replaces the current call with a different context. Goto also
> replaces the current context. Right now the limitation of goto is that the
> context must be within the same function and not introduce any new locals. A
> tail-call-goto relaxes the restriction to allow the function to change.
>
> A continuation-goto on the other hand, is not only changing the context but
> unwinding the call stack. What happens, then, if A is not in the call chain?
>
>     function setjmp(F)
>       longjmp = F
>       return true
>     end
>     function A()
>       N=1
>       if setjmp(function() goto two end) then
>         return N
>       end
>       ::two::
>       return N+1
>     end
>     function B()
>       longjmp()
>       return 0
>     end
>     print(A())
>     print(B())
>
> Does B() print 2, 0, or is it an error because A is not in the call stack?
>
> --
> tom <telliamed@whoopdedo.org>
>

It should put A back on the call stack (since it's restoring the
execution context) then I would expect it to return 2.

/s/ Adam