<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 10, 2016 at 7:25 AM, Eli Perelman <span dir="ltr"><<a href="mailto:eli@eliperelman.com" target="_blank">eli@eliperelman.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I can understand the sentiment of wanting brevity and avoiding unnecessary abstraction, but in some cases I think it comes at the cost of readability or good practice. This is why variables exist at all: to store commonly used values either for reuse or to cut down on unnecessary allocation.<div><br></div><div>Sure, I could write code to ensure my numbers did go over a certain limit with `Math.min(userInput, <wbr>9007199254740991)`, but readability and abstraction give me something without having to keep this knowledge internally and create my own allocation, e.g. `Math.min(userInput, Math.MAX_SAFE_INTEGER`.</div></div></blockquote><div><br></div><div>My message is about tradeoffs -- weighing costs against benefits. The costs I raise are cognitive burden.</div><div><br></div><div>`x => x` has lower cognitive burden than `Function.IDENTITY`</div><div>`9007199254740991` has much higher cognitive burden than `Math.MAX_SAFE_INTEGER`</div><div>`3.141592653589793` has much higher cognitive burden than `Math.PI`</div><div>`3` has lower cognitive burden than `Math.THREE`</div>







<div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>Now obviously it would be trivial for me to declare these constants in userland code like I already do, e.g. `const NOOP = () => {}`</div></div></blockquote><div><br></div><div><br></div><div>If there was a reason to do that, then it might make sense to consolidate these. However, this definition looks to me like a userland</div><div><br></div><div>`const THREE = Math.THREE;`</div><div><br></div><div>Whether in userland or not, such an "abstraction" only subtracts value.</div><div><br></div><div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>, but in projects where it's needed in several files, I'll have to put that in a module or re-declare everywhere. This is not a huge inconvenience but something that could easily allocated for in the language.</div><span class="gmail-"><div><br></div><div>> <span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif">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.</span></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif"><br></font></div></span><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif">This is true of anything; you know what you know, and are unsure of what you are unsure of. Those that understand what a no-ops and identity functions are will not need to look it up, and those that do not will look it up until they know it. Just like my personal enemies `Array#shift` and `Array#unshift`, I have to look those up every single time, and just because I can't remember which is which or their individual case doesn't mean they don't have value or that I resort to other tricks to avoid their usage. All that to say, I don't think lack of knowledge is a valid argument for these constants' non-inclusion. :)</font></div><span class="gmail-"><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif"><br></font></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif">> </font><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif">Only pay these costs when the potential benefits are real.</span></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif"><br></font></div></span><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif">I think my allusion to potential benefits is avoidance of re-declaration (DRY) and allocation.</font></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif"><br></font></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif">Just my thoughts. :)</font></div><span class="gmail-HOEnZb"><font color="#888888"><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif"><br></font></div><div><font color="#212121" face="helvetica neue, helvetica, arial, sans-serif">Eli Perelman<br></font><div><br></div><div><br></div></div></font></span></div><div class="gmail-HOEnZb"><div class="gmail-h5"><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 10, 2016 at 9:08 AM Mark S. Miller <<a href="mailto:erights@google.com" target="_blank">erights@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Aug 10, 2016 at 2:10 AM, Isiah Meadows <span dir="ltr"><<a href="mailto:isiahmeadows@gmail.com" target="_blank">isiahmeadows@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><p dir="ltr">I'll note that it's longer than just typing them out manually (and close if they're aliased):</p>
<p dir="ltr">```js<br>
Function.IDENTITY<br>
IDENTITY<br>
x => x</p>
<p dir="ltr">Function.NOOP<br>
NOOP<br>
() => {}<br>
```</p>
<p dir="ltr">Not sure if it adds anything.</p></blockquote><div><br></div></div></div></div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>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.</div><div><br></div><div>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.</div></div></div></div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><p dir="ltr"> </p>
<br><div class="gmail_quote"><div><div><div dir="ltr">On Tue, Aug 9, 2016, 14:44 Eli Perelman <<a href="mailto:eli@eliperelman.com" target="_blank">eli@eliperelman.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><div dir="ltr"><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">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 `</span><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px;line-height:1.5">Function.IDENTITY` and `Function.NOOP`. Essentially these constants would map to:</span><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">```js</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">Function.IDENTITY = (a) => a;</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">Function.NOOP = () => null; // or:</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">Function.NOOP = () => {};</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">```</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">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:</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">```js</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">// third-party API requires a callback or throws, but no functionality really needs to done:</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">thirdParty.action(Function.<wbr>NOOP);</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">// Function needs a default which *may* execute prior to having a different one specified (contrived):</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">const action = (handler = Function.IDENTITY, value = 10) =><span> </span></span><span style="line-height:1.5">handler(value)</span><span style="line-height:1.5">;</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">```</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">Thoughts? Seems like something simple with positive value. Thanks!</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5"><br></span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="line-height:1.5">Eli Perelman</span></div></div></div></div>
______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
</blockquote></div>
<br>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
<br></blockquote></div></div></div><div dir="ltr"><div class="gmail_extra"><br><br clear="all"><div><br></div>-- <br><div>    Cheers,<br>    --MarkM</div>
</div></div></blockquote></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">    Cheers,<br>    --MarkM</div>
</div></div>