Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:67931 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 10845 invoked from network); 27 Jun 2013 09:44:20 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 27 Jun 2013 09:44:20 -0000 Authentication-Results: pb1.pair.com smtp.mail=krebs.seb@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=krebs.seb@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.180 as permitted sender) X-PHP-List-Original-Sender: krebs.seb@gmail.com X-Host-Fingerprint: 209.85.212.180 mail-wi0-f180.google.com Received: from [209.85.212.180] ([209.85.212.180:51907] helo=mail-wi0-f180.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 10/70-08517-2790CC15 for ; Thu, 27 Jun 2013 05:44:19 -0400 Received: by mail-wi0-f180.google.com with SMTP id c10so410046wiw.7 for ; Thu, 27 Jun 2013 02:44:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=APXpXLva91QZMtaTE5fEdXzrBTSdJbsuhQjiXujqliY=; b=zhHKtDgRjolhZuORMIg+CKHPtc0cl0j3NXbks85OBunWk5A5DiYFvkiWj+OHAvHtu+ mK8vd4Eot/jKnEfXG37IgMccWRkq011iRp3jqavTSnnLgPp2OYGkuT4h4I8BQTZOrMEk tOfy5GPc8YoMfnWlaLB1kScw0E89ofOF/WYhbVJSutIsNn2T103NAihSlyipi+/Cqhia j59NFbWsPV1LaZtlUTB15EHS+2Wyp/D7lnlzeEWAKHYpNeeAz6XAVji8hZSw57MGrIrr TDNZwh1+vcdbha5ZWefIc77F8dtkPr8nHfzxTl4XNCdl3bnpyEbTZtnFp9rZxC/rqRAI NJXA== X-Received: by 10.194.78.110 with SMTP id a14mr5570854wjx.84.1372326255615; Thu, 27 Jun 2013 02:44:15 -0700 (PDT) MIME-Version: 1.0 Received: by 10.216.176.6 with HTTP; Thu, 27 Jun 2013 02:43:35 -0700 (PDT) In-Reply-To: References: <4622f2d7-8c09-4a31-943e-7732a9481a9a@me.com> Date: Thu, 27 Jun 2013 11:43:35 +0200 Message-ID: To: Tjerk Anne Meesters Cc: Florin Patan , Jeremy Curcio , PHP Internals Content-Type: multipart/alternative; boundary=047d7bfcf01efb676a04e01f9a43 Subject: Re: [PHP-DEV] Gauging Interest:RFC to add map() function From: krebs.seb@gmail.com (Sebastian Krebs) --047d7bfcf01efb676a04e01f9a43 Content-Type: text/plain; charset=ISO-8859-1 2013/6/27 Tjerk Anne Meesters > On Thu, Jun 27, 2013 at 4:27 PM, Florin Patan > wrote: > > > On Thu, Jun 27, 2013 at 10:17 AM, Tjerk Anne Meesters > > wrote: > > > On Wed, Jun 26, 2013 at 11:20 PM, Jeremy Curcio > > wrote: > > > > > >> Hello, > > >> > > >> I would like to submit an RFC to add a new function to the PHP > language. > > >> The function would be called "map()". The purpose of this function > > would be > > >> to take an existing value within a range and make it to a > corresponding > > >> location within a new range. > > >> > > >> The map() method would have 5 required parameters, $originalLow, > > >> $originalHigh, $newLow, $newHigh, and $value. > > >> > > >> map() would be implement the following: > > >> > > >> function map($originalLow, $originalHigh, $newLow, $newHigh, $value) { > > >> return $newLow + ($value - $originalLow) * ($newHigh - $newLow) / > > >> ($originalHigh- $originalLow); > > >> } > > >> > > >> > > > Purely from a development perspective, having five required function > > > arguments is bad; it can be reduced (by treating the first four as two > > > ranges) to three arguments, e.g. > > > > > > map([55, 92], [70, 100], 55); > > > > > > You can go one step further and call it what it is, not a mapper, but a > > > single dimensional range transformer and use a closure, e.g.: > > > > > > $transformer = get_1d_range_transformer([55, 92], [70, 100]); > > > echo $transformer(55); // get transformed value > > > > > > You might also benefit from an OOP approach. I won't paste it here, but > > > I've created a pastie for it: http://codepad.org/nGZv8GJa > > > > > > It's debatable whether this somewhat specialized code would need to be > > > coded at something other than the language level; in most likelihood > you > > > won't gain any appreciable performance increase. > > > > > > > > >> Example: > > >> Let's say we are teachers and are grading final exams. We have a > policy > > >> that the best score is 100, and the worst score is a 70. Students > scored > > >> between 55 and 92. We want to easily re-score the exams to be within > the > > >> new score range, so we would use the new map() function. Let's begin > > with > > >> mapping the lowest score: > > >> > > >> $newScore = map(55, 92, 70, 100, 55); //$newScore = 70 > > >> > > >> If we have all of our scores in an array: > > >> > > >> $scores = array(71, 65, 55, 85, 88, 86, 92, 77, 73); > > >> > > >> We could use a foreach loop to remap each value: > > >> > > >> $newScores = array(); > > >> foreach($score as $scores) { > > >> $newScores[] = map(55, 92, 70, 100, $score); > > >> } > > >> var_dump($newScores); > > >> /* > > >> array(9) { > > >> [0]=> > > >> float(82.972972972973) > > >> [1]=> > > >> float(78.108108108108) > > >> [2]=> > > >> int(70) > > >> [3]=> > > >> float(94.324324324324) > > >> [4]=> > > >> float(96.756756756757) > > >> [5]=> > > >> float(95.135135135135) > > >> [6]=> > > >> int(100) > > >> [7]=> > > >> float(87.837837837838) > > >> [8]=> > > >> float(84.594594594595) > > >> } > > >> */ > > >> > > >> Just like that, we have the new exam grades that fit our policy, > within > > >> the proper scale, without having to do any of the messy math > ourselves. > > >> > > >> While I do recognize that this is somewhat trivial to anyone who knows > > the > > >> proper formula, I feel as though it would serve the PHP community > well. > > >> Much the same as the pow() or pi() functions do. I appreciate your > > thoughts > > >> on this matter and whether or not this is worth pursuing as an RFC. > > >> > > >> Thank you, > > >> Jeremy Curcio > > >> j.curcio@me.com > > >> > > > > > > > > > > > > -- > > > -- > > > Tjerk > > > > > > Hi, > > > > > > May I kindly ask why all the PHP users would want this function in the > > core? > > > > Are you meaning to ask why would *any* php user want this function in the > core? As with most things, the need of one may be shared among a critical > mass that could swing the balance. In practice though, the critical mass is > usually determined by the internals peeps :) > But this method is _really_ quite special, isn't it? I cannot imagine, that there is "critical mass", that needs this _in core_. Just to remind: It works with pure-PHP too. Also you may provide this as PECL-extension if performance is important. > > > > I've never needed such a function nor do I understand why we should > > have it. It's good for what? > > > > It's good to perform affine transformation in a single dimension; if you've > never done this before, you wouldn't need it. > > > > And as I understand, PHP delegates the math stuff to the underlying C > > implementation so why would it be faster having it in PHP core rather > > that in PHP userland? > > > > Performance is not the only reason why features make it into the core; it's > providing a rich set of built-in features to make the developer's lives > easier, such as the latest password hashing API which is easy to get wrong > or generators that reduce boiler plate code. You cannot compare language features (generators) with functions. And "security" is always a topic on its own. > As such, an addition to the > set of numerical functions to address a particular use-case is not > unthinkable. > > > > > > > > Thanks > > ---- > > Florin Patan > > https://github.com/dlsniper > > http://www.linkedin.com/in/florinpatan > > > > > > -- > -- > Tjerk > -- github.com/KingCrunch --047d7bfcf01efb676a04e01f9a43--