On Sun, Mar 10, 2019, at 7:16 PM, Bob Weinand wrote: > > Am 10.03.2019 um 22:44 schrieb Larry Garfield <la...@garfieldtech.com>: > > > > Hello, peoples. I know it's been discussed once or twice before on the > > list, many years ago, but not recently. I therefore feel OK putting forth > > the following draft proposal for Comprehensions, aka "compact generators", > > in PHP: > > > > https://wiki.php.net/rfc/comprehensions > > > > Sara Golemon has written a preliminary patch that is partially complete > > (see the RFC link for details, it's impressively simple), but unfortunately > > doesn't have the bandwidth to complete it at this time. I am therefore > > looking for collaborators with more knowledge of internals than I (which is > > almost everyone) to help finish it up. > > > > The syntax proposed is also subject to revision if a terser but still > > lexer-friendly alternative can be proposed. > > > > At the moment I'm not calling this Proposed yet, as I don't feel > > comfortable doing so until someone else is on board to finish coding it. > > That said, if someone wants to weigh in on the concept for now (hopefully > > supportively) that's also fine. > > > > Anyone excited enough to help finish the job? > > > > (This is my first RFC collaboration, so if you're going to smack me for > > goofing something please be gentle about it.) > > > > -- > > Larry Garfield > > la...@garfieldtech.com > > Hey Larry, > First, I like it. (the idea/intention behind of providing a compact way > for list comprehensions) > > Though in general, I think this would be better off implemented with a > more flexible short closure; it feels like a special case of these. > I.e. that the comprehension syntax can be simply desugared to an > immediately invoked short closure. At that point also, it can be a > compiler only patch, if we have short closures with the appropriate > binding behavior. > I guess it should be pretty easy to build that on top of my existing > short closures patch. > > Regarding the syntax, I'd not conflate for with foreach, the > distinction is built into PHP and as such should remain. > We also might have trivial argument-less short closures written as "{ > stmt }" simply, having the comprehension written as $gen = > {foreach($list as $x) if($x % 2) yield $x * 2;}(); (note the trailing > "()" function call - if we desire to, we might make the semicolon at > the end of that single-statement closure optional.) > > Bob
Replying to a couple of people at once here: 1) I am 100% in favor of adopting short closures, the less syntax ceremony in it the better. Bob, if there's a logistical/non-code way I can help make that happen let me know, because we wants it, precious. 2) That said, I'm not sure it would fully obviate the need for a generator-specific syntax. Even if the examples from Bob and Wes are shorter than what I had envisioned for a short-closure version (nice!), they're still notably longer than a purpose-built generator version. Too, and I acknowledge this is a highly subjective statement, they have a lot of syntax salad. ";)();" at the end is a superb thing to mistype more often than you get it right. If there were some way to reduce that then I might be convinced but I'd have to see it first. (And that means we need short closures still, which we don't have yet.) 3) I'd still be in favor of adding a type check to comprehensions, too; I don't know how or if that would be possible if they were "just" a fancy use of short-closures. 4) Regarding the specific syntax proposed, it's honestly more verbose than I'd like as is. Sara and I tried putting the expression first, as in Python, but that made the lexer very unhappy since "[$foo ... ]" is already legal syntax for an array of one iterable. The yield keyword is there to help the parser (and reader) tell where the expression begins since, being after the conditional, it needs some kind of separator. If anything, I'd be interested in considering entirely different syntaxes borrowed from other languages (see the linked Wikipedia page) that would involve even fewer keywords, not using longer keywords. That's why, for instance, it uses for instead of foreach. 5) Regarding Javascript comprehensions, well drat. I didn't realize it had been withdrawn. That's disappointing. I'll adjust the RFC at some point soonish (it's after midnight here right now) to not mention them. 6) array_map/array_filter order reversed: Bruce, I think you're right. It took a while for me to grok that it is. Which IMO is even more reason we want some more comprehensible and compact syntax for that use case, as it's surprisingly common. :-) 7) Bruce, there is an example of multiple foreach()s. See the "Iterate a 2D array" section in the long code block. 8) To George: yes, since comprehensions as envisioned would work on any iterable, and generators are iterables, and comprehensions are generators, passing the generator produced by one comprehension to another comprehension is 100% legit. Strings are not currently iterable, though, so they wouldn't work. Making strings iterable is an entirely separate discussion so let's not go there, but were that to ever happen then they would "just work" in comprehensions as well. 9) To Alex: Because the syntax feels more akin to Generators at the user-level, that's how I described them. You're writing code that yields items one by one. That said, if under the hood it fits the code better to have it nominally return an \Iterator rather than \Generator I don't much care either way. That's an implementation detail that I leave to whoever I manage to bribe to finish the code. :-) --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php