<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Sure thing Rick, I will definitely do that.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">I'd love to hear any current thoughts and feedback around the idea though.</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Thanks!</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <div class="" id="bloop_sign_1382340426391941120"><div><font face="Helvetica">- Jonathan Barronville</font><div><a href="https://twitter.com/jonathanmarvens"><span style="color: rgb(0, 0, 0); font-family: Helvetica; ">@jonathanmarvens</span></a><br></div></div><div><span style="font-family:helvetica,arial;font-size:13px"></span><span></span></div></div> <br><p style="color:#A0A0A8;">On October 21, 2013 at 1:26:57 AM, Rick Waldron (<a href="mailto://waldron.rick@gmail.com">waldron.rick@gmail.com</a>) wrote:</p> <blockquote type="cite" style="border-left:1px #004080 solid !important;margin-left:0px;padding-left:5px;"><span><div><div>






<div dir="ltr"><br>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">On Sun, Oct 20, 2013 at 9:01 AM, Jonathan
Barronville <span dir="ltr"><<a href="mailto:jonathan@belairlabs.com" target="_blank">jonathan@belairlabs.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">
<div style="margin:0px">
<div style="margin:0px"><font face="Helvetica, Arial">Hi
everyone.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">I have a
proposal for ES6. I don't know if it's been discussed before, so if
it has, I don't mean to waste your time … hopefully, I'll be
directed to the right place.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">One of the
most debated JavaScript topics (at least in my experience) is
whether or not one should modify objects that don't belong to them
... some say it's okay if you "know what you're doing" and others
see it as a crime.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">I propose we
solve this problem by adding "refinements" to ES6. Ruby v2.0.0
introduced a nice little feature dubbed "refinements". Refinements
allow you to extend other objects for specific modules of code. I
know this isn't a Ruby mailing list, but because the inspiration
comes from the Ruby implementation, an example is in order (feel
free to ignore it).</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Say you want
to modify the `to_str()` method in the built-in String class in
Ruby, the common way to do this is as follows.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```ruby</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">class
String</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">  def
to_str()</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">   
"Blah, blah, blah ... this is an example."</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"> 
end</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">end</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Very simple
... just re-open the class and create a method with the same name.
However, there's a problem with this, which happens to be the same
problem we have in JavaScript, and that's the fact that we've now
just modified this method permanently for the rest of the
execution.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Well, with
refinements, the better way of accomplishing the same thing is as
follows.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```ruby</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">module
MyLibrary</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"> 
refine(String) do</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">   
def to_str()</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">   
  "Blah, blah, blah ... this is an example."</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">   
end</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"> 
end</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">end</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Now, if you
try to send `to_str()` to, say, a string object `"hello"`
(`"hello".to_str()`), you'll get the original `"hello"` as a return
value. In order to use the refinements made to the class, you have
to do the following.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```ruby</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">using
MyLibrary</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">puts("hello".to_str())</font></div>
<div style="margin:0px"><font face="Helvetica, Arial">```</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Running the
code above properly outputs the string `Blah, blah, blah ... this
is an example.`.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Refinements
can only be used after a `using` statement and only within that
file.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Given that
we're already getting modules in ES6, I believe something similar
to this would be a great addition to the language.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">I can
definitely work on a more in-depth and detailed proposal, with
specific JavaScript examples, if needed, but I just would like to
hear thoughts around the idea.</font></div>
<div style="margin:0px"><font face="Helvetica, Arial"><br></font></div>
<div style="margin:0px"><font face="Helvetica, Arial">Thanks!</font></div>
</div>
</div>
</blockquote>
<div><br></div>
<div>I think this idea is certainly worth writing a strawman for,
but it's too late in the ES6 cycle and this couldn't even be
considered until ES7. Would you be willing to write up a
"Refinements" strawman with some proposed ES-centric syntax and
some preliminary semantics sketched? </div>
<div><br></div>
<div>Rick</div>
<div><br></div>
<div><br></div>
</div>
</div>
</div>


</div></div></span></blockquote></body></html>