Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:84231 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 3915 invoked from network); 3 Mar 2015 12:28:45 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 3 Mar 2015 12:28:45 -0000 Authentication-Results: pb1.pair.com smtp.mail=rowan.collins@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=rowan.collins@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.178 as permitted sender) X-PHP-List-Original-Sender: rowan.collins@gmail.com X-Host-Fingerprint: 209.85.212.178 mail-wi0-f178.google.com Received: from [209.85.212.178] ([209.85.212.178:44218] helo=mail-wi0-f178.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id BA/F5-03783-CF8A5F45 for ; Tue, 03 Mar 2015 07:28:45 -0500 Received: by wiwl15 with SMTP id l15so22285441wiw.3 for ; Tue, 03 Mar 2015 04:28:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=NXlNXkrWHoZU9PAU4mvIdMX0/x3ZtYBcEn0ZUDq1bak=; b=MKs8bwEaGESPoNw309k/25DI+iGnU83NKu5mSr/1SgeZ2HlCOckVqPEF6n3Y2Mas58 J2wLAFSxhMTJofTirPXT57hZoRgSttGbdJv/Gqxjahw7cYqTYhfQh154/Fn38VeLglXN jooQikshNaSwFWaUz4C7Kj/RfCtBgDPq5oX48WnH79NhSmWo0xQxmpFelKJw/LUurEBd H0F4JHzb/oEnD0tuUnkfm/1DtMM+YVtRP52sCNRmrxdszKNG1N62DFgMLmZhOKxOnVoj rZZGCje6q++0+1fzULcY/wk2pO03VCfWLHZ+1JXN6LJ/ntNywmeIyY6VoKHBngkEYV54 XdNA== X-Received: by 10.181.13.148 with SMTP id ey20mr2463943wid.18.1425385720491; Tue, 03 Mar 2015 04:28:40 -0800 (PST) Received: from [192.168.0.159] ([62.189.198.114]) by mx.google.com with ESMTPSA id q6sm2262857wix.13.2015.03.03.04.28.38 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Mar 2015 04:28:39 -0800 (PST) Message-ID: <54F5A8C4.8070508@gmail.com> Date: Tue, 03 Mar 2015 12:27:48 +0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Bob Weinand CC: Niklas Keller , Daniel Lowrey , "internals@lists.php.net" References: <54F59C45.7080704@gmail.com> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [PHP-DEV] [RFC Discuss] Generator Delegation From: rowan.collins@gmail.com (Rowan Collins) Bob Weinand wrote on 03/03/2015 12:08: >> Am 03.03.2015 um 12:34 schrieb Rowan Collins : >> >> Niklas Keller wrote on 03/03/2015 10:55: >>> Gr, top-posting... >>> >>> >>> Sorry, was on mobile. ;-) >>> >>> However, since the existence of the word "yield" is the only thing >>> that >>> marks a coroutine now, how about using a variant of that for the final >>> value, e.g. "yield final $foo"? >>> >>> >>> What's the final value? The last "yield"ed value or a return? >> "yield final" would mark the final result of the coroutine, as opposed to the intermediate values passed out with a normal "yield". >> >> >>> Just to give you some real world example: >>> If you're using "return", it would look like that: >>> >>> public function getSession ($sessionId) { >>> $result = yield $this->redis->get("session.{$sessionId}")); // We're waiting here until redis responded. >>> return json_decode($result); >>> } >> My suggestion is simply to change the keyword: >> >> public function getSession ($sessionId) { >> $result = yield $this->redis->get("session.{$sessionId}")); // We're waiting here until redis responded. >> yield final json_decode($result); >> } >> >> >> The reasoning being that when you run getSession(42), it *doesn't* return the result of json_decode(), it returns a pointer to the coroutine's state, which you can resume later. >> >> Actually, I don't think that example makes sense, because JSON gets sent out at the first yield, and then sent back in, so the caller would look something like this: >> >> $foo = getSession(42); >> $json_data = $foo->current(); >> $foo->send($json_data); >> $decoded = $foo->getReturn(); >> >> But never mind, I think we both get the idea. >> >> I understand the desire for a "final result", but I don't like reusing the word "return", because it's never "returned" as the result of running the function, it's just made available through some specific method/syntax. >> >> Regards, >> -- >> Rowan Collins >> [IMSoP] > Hey, > > We currently already have "return;" (without value) as allowed syntax to terminate Generator execution. Thus, the logical consequence is just adding a value to that return. Hm, I didn't realise that. I suppose it makes sense that you'd want a way to do that, but it does make it very hard to see if something's going to behave as a function or a coroutine if they use the same keywords to mean different things. > When we want to *return*, it should be also a real *return". Yes, it is just accessible through special syntax (or a method), but it's still *return*ing into the calling frame. Well, so is "yield" - it just leaves the Generator in a state that can be resumed, whereas "return"/"yield final" leaves it in a final, non-resumable state. > Why should the word "return" be unique to methods or functions? It just doesn't feel like the same thing as a return value to me, for the same reason a generator doesn't feel like the same thing as a function. In "function foo() { return 42; }", "return" means "this is what you'll get when you run foo()"; in "function foo() { return 42; yield; }", what you get when you run foo() is a pointer to the resumable state, and return means "this is what you'll get if you ask the generator/coroutine instance you get by running foo() for its final result". Regards, -- Rowan Collins [IMSoP]