I feel like some of these examples would be better covered by command object pattern and data-transaction objects, instead of FP idioms. wrap_in_buffer pretty clearly so.
2021-03-25 10:28 GMT+01:00, Rowan Tommins <rowan.coll...@gmail.com>: > On 25/03/2021 04:12, Mike Schinkel wrote: > >> Actually, there is a way to declare a local variable. Use the long >> function syntax instead as there is no proposal to deprecate it. > > That's not quite what I meant. I meant that you can't say "capture by > default, but this variable is definitely local". > > I'm guessing maybe "$foo = null;" at the top of the function would stop > it auto-capturing, but the semantics of what exactly gets captured > aren't spelled out in the RFC. That really needs to be added IMO. > > >> Instead of using array_filter() with a side-effect free closure, I use a >> for loop because it is easier to reason about visually. > > > Is that a bad thing? In many cases it's probably more efficient, and > easier to read. > > > > >> It is not clear to me from reading the PEP how a "with" statement obviates >> the benefit of variable auto-capture? Maybe because I don't "think" in >> Python, so from reading their examples I cannot see how this relates? > > > I didn't mean to say that the "with" statement would replace closures in > general, but it would make them unnecessary *for some specific use > cases*. You mentioned: > > > prime examples are database transactions and using throw-aware > buffering handlers. > > If your current code looks something like this: > > wrap_in_buffer(function($transaction) use ($to, $library, $thread, > $author, $title, $library_name, $top_post) { > doSomething($to, $library, $thread); > andThenSomethingElse($author, $title, $library_name, $top_post); > }); > > That's a perfect use case for a Context Manager: > > with ( wrap_in_buffer() ) { > doSomething($to, $library, $thread); > andThenSomethingElse($author, $title, $library_name, $top_post); > } > > There's no callback, so no need to capture anything, and the > implementation of all the try-catch-finally logic would be baked into > the language, so the implementation of wrap_in_buffer() would also be > much simpler. > > > Regards, > > -- > Rowan Tommins > [IMSoP] > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php