Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:70304 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 892 invoked from network); 22 Nov 2013 23:54:33 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Nov 2013 23:54:33 -0000 Authentication-Results: pb1.pair.com header.from=theanomaly.is@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=theanomaly.is@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 74.125.82.180 as permitted sender) X-PHP-List-Original-Sender: theanomaly.is@gmail.com X-Host-Fingerprint: 74.125.82.180 mail-we0-f180.google.com Received: from [74.125.82.180] ([74.125.82.180:48590] helo=mail-we0-f180.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 41/00-00832-7BEEF825 for ; Fri, 22 Nov 2013 18:54:32 -0500 Received: by mail-we0-f180.google.com with SMTP id u56so1778022wes.25 for ; Fri, 22 Nov 2013 15:54:28 -0800 (PST) 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=cpkX2To8F3UMPQ9z/1OFbJuIQ+msmTWNkFjiEHMSRy4=; b=MWwzoUGSIxY/JlbXuTrhalWIrlwMIIIGlFYFDCcR8y87xD4IbNwcr6gQf4jaISv7eh NwlZkBn7MvKBZIVnvs3k3SJNv5yGr6YpErcKerzOUP75uSwWKxuvXCWYfe0zWbrE/q3x 7mn1GlWSFy2EcfubV3V9qbPxhLigHFaQTxFavNkPG0KIgY6Cx6wQEFNBMSgxqgSNfTrH LwhntAwHcX/d7y1XpJoS4tYzhl3hEiptSBoErCY2WHMbVCnstPVxouio63maeTzIG6ub +fwOejWGEf7Qhogrdfhx5Og+PvD4bjVJL0Q0yTL0gKu6y3yOqOYAgIbSMzkHRBImCl0K Yl1w== MIME-Version: 1.0 X-Received: by 10.180.221.38 with SMTP id qb6mr4661140wic.8.1385164468634; Fri, 22 Nov 2013 15:54:28 -0800 (PST) Received: by 10.227.134.196 with HTTP; Fri, 22 Nov 2013 15:54:28 -0800 (PST) In-Reply-To: References: Date: Fri, 22 Nov 2013 18:54:28 -0500 Message-ID: To: Nikita Popov Cc: Tjerk Meesters , PHP Internals Content-Type: multipart/alternative; boundary=001a1134d2da1bcab904ebccbcf5 Subject: Re: [PHP-DEV] Power function as operator From: theanomaly.is@gmail.com (Sherif Ramadan) --001a1134d2da1bcab904ebccbcf5 Content-Type: text/plain; charset=ISO-8859-1 On Fri, Nov 22, 2013 at 6:37 PM, Nikita Popov wrote: > On Fri, Nov 22, 2013 at 5:58 PM, Tjerk Meesters >wrote: > > > Hi, > > > > To challenge myself I had tasked myself to introduce a new operator and > > opcode to the language; now that I'm done with it, I wanted to measure > the > > response on the list to actually get it merged before writing an RFC. > > > > My work can be found here: > > https://github.com/datibbaw/php-src/compare/pow-operator > > > > It introduces the pow() function as an operator ** (double asterisk), as > > can be found in languages such as Python (with perhaps the notable > > difference that it's right associative there). > > > > The logic gets exposed via the ZEND_POW opcode and all the logic that > went > > into pow() itself is copied into it. The exceptions are that an > expression > > such as [] ** 2 (squared empty array) will cause a fatal error because > the > > operands are incompatible, whereas pow([], 2) would give 0. > > > > Why this operator? Basically because: > > 1) it's shorter (the keyboard rejoices). > > 2) it's faster (no ZEND_CALL). > > 3) it's found in other languages too. > > > > I've only implemented one of the test suites; there are quite a few for > > just one function, but when needed I can add those others as well. > > > > Btw, changes to vld aren't pushed yet. > > > > Let me know! > > > > I don't really see a need for this operator in PHP. From my experience > pow() isn't some particularly commonly used function, so I don't think it > needs its own operator. (But I don't think that adding it would > particularly hurt either...) > > Anyway, if this is added I would strongly recommend to make the operator > non-associative. I have no idea how Python came up with the idea to make ** > right-associative, which violates basic programming language design rules > (all binary non-assignment operators are left-associative) and goes against > (at least my) common sense, but now that they made the choice it's likely > unwise to deviate from it by making it left-associative in PHP (see ternary > operator mess...) So I think making it non-associative makes for a safe > middle ground. This will cause 2 ** 3 ** 2 to throw an error and require > you to group it as either (2 ** 3) ** 2 or 2 ** (3 ** 3). Less ambiguity. > > Nikita > I'm not entirely sure that making it non-associative is a great idea either, but I have to agree that it does find *some* middle ground. Right-associative exponent operator didn't seem right to me either. --001a1134d2da1bcab904ebccbcf5--