On Mon, Mar 11, 2019, at 8:16 AM, Nikita Popov wrote: > On Sun, Mar 10, 2019 at 10:45 PM Larry Garfield <la...@garfieldtech.com> > wrote: > > > 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/cohttps://externals.io/message/61021mprehensions > > <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.) > > > > I've brought up a similar proposal a few years ago, probably around the > time generators were first introduced: https://externals.io/message/61021
Ah, I knew I'd seen it on the list once before. Thanks. > I think my main point of feedback would be to stick closer to existing PHP > syntax, even if it costs us some brevity. I would prefer > > $gen = [foreach ($list as $x) if ($x % 2) yield $x * 2]; > > over > > $gen = [for $list as $x if $x % 2 yield $x * 2]; > > The latter is nice in languages that generally use "for" for this purpose > and generally allow omitting parentheses, but I don't think it's good to > introduce this kind of syntax inconsistency in one place. > > Similarly, I found the ability to omit the "yield" expression somewhat > confusing. Especially once you get to nesting > > $gen = [for $a as $b for $b as $c]; In that case you'd get a list of $c returned (implicit yield $c), although I can see where that's non-obvious. OTOH, requiring the yield statement every time in the majority case seems like excessive verbosity and ceremony. > the behavior becomes non-obvious. Also wondering how this part interacts > with keys, do you decide whether or not to yield the keys based on whether > they are part of the for expression? > > $gen = [for $list as $v]; // drops keys > $gen = [for $list as $k => $v]; // keeps keys Yes, that's the intent. No yield means implicit "key and value"; if key is omitted then it's implicitly just 0-based numbers. > Finally, Python makes a distinction between list comprehensions using [] > and generator expressions using (). This proposal effectively corresponds > to generator expressions, but uses the [] syntax. I'm wondering if that > will cause confusion. > > Regards, > Nikita I don't think so. For one, although we started from Python syntax the result is decidedly not Python, so I wouldn't expect people to assume the same symbols mean the same things. For another, Python uses [] for a list-producing comprehension, and {} for a dictionary-producting comprehension. Whether those return generators or not is a version question, not a syntax question. Since PHP doesn't differentiate between lists and dictionaries to begin with there's no need for different syntax. Our "dictionaries" already use []. --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php