Pure functions in EcmaScript

Axel Rauschmayer axel at rauschma.de
Wed Nov 28 14:23:23 PST 2012


Ah, global getter. Didn’t think of that.

On Nov 28, 2012, at 22:47 , Brendan Eich <brendan at mozilla.org> wrote:

> Axel Rauschmayer wrote:
>> Would returning NaN be impure (apart from running the risk of it having been changed to something different, globally)?
> 
> You can't say "apart from...", that's exactly the risk. It could be replaced with a global getter that has effects.
> 
> Isolating a pure function to a sandbox or prepared global environment saves this, but then the function's "pure" annotation can't be enough to express what's required.
> 
> /be
>> 
>> On Nov 28, 2012, at 21:35 , Oliver Hunt <oliver at apple.com <mailto:oliver at apple.com>> wrote:
>> 
>>> 
>>> On Nov 28, 2012, at 12:25 PM, Waldemar Horwat <waldemar at google.com <mailto:waldemar at google.com>> wrote:
>>> 
>>>> On Wed, Nov 28, 2012 at 5:39 AM, Marius Gundersen <gundersen at gmail.com <mailto:gundersen at gmail.com>> wrote:
>>>> 
>>>>    On Wed, Nov 28, 2012 at 1:20 PM, Andreas Rossberg
>>>>    <rossberg at google.com <mailto:rossberg at google.com>> wrote:
>>>> 
>>>>        Second, due to the extremely impure nature of JavaScript,
>>>>        there aren't
>>>>        many useful pure functions you could even write. For
>>>>        example, your
>>>>        'sum' function is not pure, because the implicit conversions
>>>>        required
>>>>        by + can cause arbitrary side effects.
>>>> 
>>>> 
>>>>    Functions passed to the array methods map, reduce, filter, etc
>>>>    would be good candidates for pure/side-effect-free functions.
>>>>    These functions shouldn't alter any state; they should only
>>>>    return a new value based on the parameter they were sent.
>>>> 
>>>> 
>>>> You haven't addressed Andreas's point: Almost any function you write is nonpure, including your sum example. As a fun exercise, go ahead and write a pure version of your sum example.
>>>> 
>>>>    Waldemar
>>> Here you go:
>>> 
>>> function sum(a, b) {
>>>   var undefined;
>>>   switch (typeof a) {
>>>   case "number":
>>>   case "string":
>>>       break;
>>>   default:
>>>       return +undefined;
>>>   }
>>> switch (typeof b) {
>>>   case "number":
>>>   case "string":
>>>       break;
>>>   default:
>>>       return +undefined;
>>>   }
>>>   return a + b;
>>> }
>>> 
>>> 
>>> 
>>>> 
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>> 
>>> _______________________________________________
>>> es-discuss mailing list
>>> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
>>> https://mail.mozilla.org/listinfo/es-discuss
>> 
>> -- 
>> Dr. Axel Rauschmayer
>> axel at rauschma.de <mailto:axel at rauschma.de>
>> 
>> home: rauschma.de <http://rauschma.de>
>> twitter: twitter.com/rauschma <http://twitter.com/rauschma>
>> blog: 2ality.com <http://2ality.com>
>> 
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
> 

-- 
Dr. Axel Rauschmayer
axel at rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20121128/772f72f9/attachment-0001.html>


More information about the es-discuss mailing list