lua-users home
lua-l archive

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


2018-07-15 19:49 GMT+02:00 Pierre Chapuis <catwell@archlinux.us>:
>> I don't quite understand the problem, and maybe my ignorance shows,
>> but ...
>>
>> What does a 'with' structure achieve that
>>
>> repeat
>>   local whatever
>> ...
>>   if exception then break end
>> ...
>> until false
>>
>> does not?
>
> I don't really get how this is similar to "with". The goal of "with" (i.e Python Context Managers [1]) is to make sure that something is executed at the beginning of a code block and something else at the end. So it would be more something like this in Lua terms:
>
>     with foo do
>         -- stuff
>     end
>
> ... works a bit like...
>
>     do
>         foo:__enter()
>         -- stuff
>         foo:__exit()
>     end
>
> ... except `__exit` is called no matter what happens in "stuff", including all those cases:
>
>     -- foo:__exit() is called once
>     local function f(foo)
>         with foo do
>             return
>         end
>     end
>
>     -- foo:__exit() is called twice
>     for i = 1, 5 do
>         with foo do
>             if i == 2 then
>                 break
>             end
>         end
>     end
>
>     -- foo:__exit()  is called once
>     with foo do
>         error()
>     end
>
> This is important when you write code that deals with a resource that has to be released immediately and not asynchronously so you cannot rely on `__gc`, e.g. a database transaction, a mutex, arguably some file descriptors...
>
> [1] https://docs.python.org/2.5/whatsnew/pep-343.html

Thanks for explaining.