Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:88416 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 76386 invoked from network); 22 Sep 2015 18:48:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Sep 2015 18:48:23 -0000 Authentication-Results: pb1.pair.com header.from=ircmaxell@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=ircmaxell@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.171 as permitted sender) X-PHP-List-Original-Sender: ircmaxell@gmail.com X-Host-Fingerprint: 209.85.212.171 mail-wi0-f171.google.com Received: from [209.85.212.171] ([209.85.212.171:34974] helo=mail-wi0-f171.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 3B/01-00408-8DB91065 for ; Tue, 22 Sep 2015 14:20:09 -0400 Received: by wicge5 with SMTP id ge5so173932891wic.0 for ; Tue, 22 Sep 2015 11:20:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=j1AESx7mhs47u+20XrQ+TLGPvjMdHy4lvaGZc6ZcZDU=; b=KjZan1o63AwI7t9I+sypUfeQlKVHiO4pktget8fy15Ecu+QW4bmBqc1QixW680eMs3 nKI3rx/LRXvpdxV9BmBp3pemKL2orgylhCvImXH3FLYo0CBvitl7m6yOVwWVlwUQ9MYO vQ0Cp3peXQdI8T88nXEB1BziLIdOQ4Gtccwwa7dTgKfShePs1HzIYONZGyi0i3VU60N2 7rCqrWqsB8rZkMnRlOGIr4tJepaHX2B/B8/e0CexUVWVwpAB0rD2cwh2W94NZCzLO0X/ zpnjqRMyNsEwLV6WJnzZwUIumbj9g3okVYcU64Oj/cmXKI4T+CJxebii+D6/aL2LRbMb kbXg== MIME-Version: 1.0 X-Received: by 10.180.106.99 with SMTP id gt3mr19788890wib.51.1442946005546; Tue, 22 Sep 2015 11:20:05 -0700 (PDT) Received: by 10.28.55.18 with HTTP; Tue, 22 Sep 2015 11:20:05 -0700 (PDT) In-Reply-To: References: Date: Tue, 22 Sep 2015 14:20:05 -0400 Message-ID: To: Dmitry Stogov Cc: Bob Weinand , Joe Watkins , PHP internals Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] [RFC] [VOTE] Short Closures From: ircmaxell@gmail.com (Anthony Ferrara) Dmitry, On Tue, Sep 22, 2015 at 2:05 PM, Dmitry Stogov wrote: > On Tue, Sep 22, 2015 at 7:01 PM, Bob Weinand wrote: > >> >> > Am 22.09.2015 um 17:36 schrieb Dmitry Stogov : >> > >> > On Tue, Sep 22, 2015 at 4:54 PM, Joe Watkins >> wrote: >> > >> >> I'd really like to understand what you're trying to say there Dmitry, >> but >> >> I don't get it. >> >> >> >> What is your example function trying to show ? >> >> >> >> As it mentions in the RFC, vars in short closure are by-value, so I >> can't >> >> see what side effects you might be thinking of ? >> >> >> > >> > It's clear to me that foo() will return NULL, but how many warnings about >> > unused variable $y will we get? >> > >> > Thanks. Dmitry. >> > >> > >> >> >> >> Cheers >> >> Joe >> >> >> >> On Tue, Sep 22, 2015 at 9:25 AM, Dmitry Stogov wrote: >> >> >> >>> I'm against the magic - "automatically use () all of the (compiled) >> >>> variables". >> >>> I'm also against compound short closures with curly brackets. >> >>> in my opinion they opens too many ambiguous questions. >> >>> >> >>> function foo() { >> >>> (($x) ~> {$y = 3; return $y + $x;})(5); >> >>> return $y; >> >>> } >> >>> >> >>> also think about nested closures and use of variables from not direct >> >>> enclosure. >> >>> >> >>> I'm not sure if we need all "functional programming" features in PHP, >> but >> >>> if we introduce them, lets do it consistently with the existing >> language. >> >>> I think, this proposal can't be approved without support for type >> hinting. >> >>> >> >>> Thanks. Dmitry. >> >>> >> >>> On Tue, Sep 22, 2015 at 4:59 AM, Bob Weinand >> wrote: >> >>> >> >>>> Hey, >> >>>> >> >>>> Thanks for all your feedback in the discussion thread! >> >>>> >> >>>> So, before I start the vote, just two quick notes: >> >>>> I've added two notes about the statement syntax and the single >> variable >> >>>> use. >> >>>> Though a few people complained, I'm not switching to the ==> operator, >> >>> as >> >>>> I noticed many people expected typehints to work (they don't due to >> >>> parser >> >>>> limitations) when they compared to Hack's short Closures. It also >> >>> allows us >> >>>> to differ syntax-wise [e.g. for typehints] from Hack without causing >> any >> >>>> confusion later. Which should be the smartest choice: Avoid conflicts. >> >>> (If >> >>>> anyone strongly feels against that, he may vote no, but I would like >> to >> >>> not >> >>>> bikeshed that in this Vote thread, but leave it free for eventual >> actual >> >>>> issues.) >> >>>> >> >>>> Now, the link to the RFC about Short Closures: >> >>>> https://wiki.php.net/rfc/short_closures >> >>>> or straight ahead to the vote: >> >>>> https://wiki.php.net/rfc/short_closures#vote >> >>>> >> >>>> Thanks, >> >>>> Bob >> >> >> Notice: Undefined variable: y in php shell code on line 3 >> >> It just yields exactly one notice about the inexistent $y (as it obviously >> does not leak through the scope): by-value binding. >> >> I'm not sure what your issue here is? >> > > The current PHP version emits two warning on similar constructs, and this > is explainable because we explicitly "use" $y. > > $ sapi/cli/php -r 'function foo(){(function($x) use ($y){$y=3; return > $y+$x;})(5);return $y;} var_dump(foo());' > PHP Notice: Undefined variable: y in Command line code on line 1 > > PHP Notice: Undefined variable: y in Command line code on line 1 > > NULL > There's an important distinction here. The explicit `use($y)` triggers a notice because you said to use an undefined variable. function foo() { (($x) ~> {$y = 3; return $y + $x;})(5); return $y; } In this case, there's no practical binding of `$y` at all. The `$y` in the scope of the closure is never actually read from before it is assigned to. Meaning the variable doesn't need to exist prior to that assignment, meaning that it doesn't have to be bound (used), and as such shouldn't throw a notice. This becomes a ton easier if we ever move to an explicit CFG+SSA compile step. Then, we can see which variables dominate the closure to see what needs to be bound vs what doesn't. In this example, converted to SSA, you'd see: function foo() { $y1 = 12; (($x1) ~> {$y2 = 3; return $y2 + $x1;})(5); return $y1; } Hence you can see that `$y2` is truly an independent variable, and hence `$y1` never needs to be bound (and hence no notice). So your case of explicitly using `$y` isn't actually what's happening with the closure (at least with respect to userland behavior). Hence why the lack of notice exists. My $0.02 at least, Anthony