Function constants for Identity and No-op

Mark S. Miller erights at google.com
Wed Aug 10 14:08:14 UTC 2016


On Wed, Aug 10, 2016 at 2:10 AM, Isiah Meadows <isiahmeadows at gmail.com>
wrote:

> I'll note that it's longer than just typing them out manually (and close
> if they're aliased):
>
> ```js
> Function.IDENTITY
> IDENTITY
> x => x
>
> Function.NOOP
> NOOP
> () => {}
> ```
>
> Not sure if it adds anything.
>

Even aside from brevity, `x => x` and `() => {}` are more readable than
`Function.IDENTITY` and `Function.NOOP` for a very simple reason. The
semantics of the shorter forms are obvious and clear, give knowledge only
of the core language. The semantics of the named forms can be guessed
rather well from the names, but one cannot be sure without looking up or
remembering their definitions. As we all know, abstraction has tremendous
potential benefits. But it also has these costs -- the need to learn the
meaning of new definitions. Only pay these costs when the potential
benefits are real.

Also, other things being equal, a briefer form is easier to read. In this
case, other things are not equal but both considerations point in the same
direction.


> On Tue, Aug 9, 2016, 14:44 Eli Perelman <eli at eliperelman.com> wrote:
>
>> I'm not sure if something like this has been proposed before, but I often
>> find myself declaring constants for the identity function and the no-op
>> function. I think it would be useful to have constants available on
>> Function containing these values. For example `Function.IDENTITY` and
>> `Function.NOOP`. Essentially these constants would map to:
>>
>> ```js
>> Function.IDENTITY = (a) => a;
>> Function.NOOP = () => null; // or:
>> Function.NOOP = () => {};
>> ```
>>
>> These could then be used in places where non-user-controlled APIs need
>> default functions need to be executed, or as placeholders for default
>> values that may be executed before a function has been supplied. For
>> example:
>>
>> ```js
>> // third-party API requires a callback or throws, but no functionality
>> really needs to done:
>> thirdParty.action(Function.NOOP);
>>
>> // Function needs a default which *may* execute prior to having a
>> different one specified (contrived):
>> const action = (handler = Function.IDENTITY, value = 10) =>
>> handler(value);
>> ```
>>
>> Thoughts? Seems like something simple with positive value. Thanks!
>>
>> Eli Perelman
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>


-- 
    Cheers,
    --MarkM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160810/e54eafde/attachment-0001.html>


More information about the es-discuss mailing list