<br><br><div class="gmail_quote">On Sun, Sep 5, 2010 at 6:33 PM, Mark S. Miller <span dir="ltr">&lt;<a href="mailto:erights@google.com">erights@google.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<a href="http://wiki.ecmascript.org/doku.php?id=strawman:classes_as_sugar" target="_blank">http://wiki.ecmascript.org/doku.php?id=strawman:classes_as_sugar</a><div><br></div><div>* Classes as Sugar</div><div><br></div></blockquote>
<div><br></div><div>All this looks a bit strange. From several positions.</div><div><br></div><div>First, combination of classes and prototypes. Currently, the paradigm used in ECMAScript with delegation based prototypes does not differ much from a class-based paradigm with &quot;first-class&quot; dynamic classes. The good example is Python.</div>
<div><br></div><div>You won&#39;t find a big difference between Python&#39;s (&quot;first-class&quot; dynamic) classes and prototypes+constructor in ECMAScript. Thus, the major aspects should be considered: methods/properties resolution and code-reuse stylistics. In both, ECMAScript and Python, a delegation based inheritance is used to achieve both objectives. I.e. Python&#39;s classes are just syntactic sugar of delegation based model used in ECMAScript.</div>
<div><br></div><div>Thus (the lacks of your desugarred code):</div><div><br></div><div>1. you don&#39;t have a good code-reuse mechanism (which should be used the same -- a delegation to a class/prototype), i.e. every returned frozen instance has own properties/methods that is non efficient.</div>
<div><br></div><div>2. you don&#39;t have an inheritance (again code-reuse, but the code of parent prototypes).</div><div> </div><div>Both lacks may be avoided even in ES5 implementation. Though, the desugarred code will look ugly (with passing private state of objects to be able place all methods -- private and public in to the prototype (public methods) and its surrounding environment (private methods), having only one instance of a method for for a class). Using new things such Names or WeakMaps possibly it&#39;s even easier to achieve.</div>
<div><br></div><div>In your approach, there is a code-reuse, but it&#39;s made as cloning, but not dispatching. Cloning (concatenative prototypes) is faster, but very inefficient by memory. So, it&#39;s even may be called a &quot;smart copy-paste&quot;, but not &quot;reuse&quot; (of the same memory).</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div></div>
<div><br></div><div>The part of this strawman I am least happy is the rules of &quot;this&quot; at &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:classes_as_sugar#delicate_self_reference" target="_blank">http://wiki.ecmascript.org/doku.php?id=strawman:classes_as_sugar#delicate_self_reference</a>&gt;. Suggestions appreciated. Thanks.<br clear="all">

<br></div></blockquote><div><br></div><div>The second one issue is that the sugar is not so sugarred. I think it should syntactically be minimalistic and do not use several forms of methods/functions (that will avoid the problem with /this/ value).</div>
<div><br></div><div>As I see it:</div><div><br></div><div>class Point(x, y) {</div><div>  </div><div>  private:</div><div>    </div><div>    var x = 10</div><div>    var y = 20</div><div>    </div><div>    function calculate(z) {</div>
<div>      var x = 30</div><div>      // use &quot;this&quot; to refer instance</div><div>      // properties and distinguish from</div><div>      // local var of a function</div><div>      this.x + this.y + x + z</div><div>
    }</div><div><br></div><div>  public:</div><div>    </div><div>    var z = 30</div><div>    </div><div>    function foo(z) {</div><div>      this.bar() + this.calculate(z);</div><div>    }</div><div>    </div><div>    const function bar() {</div>
<div>      this.z + 10</div><div>    }</div><div><br></div><div>}</div><div><br></div><div>class MyPoint(x, ...args) inherits Point {</div><div>  public:</div><div>    function foo() {</div><div>      super(this.x) + 30</div>
<div>    }</div><div>}</div><div><br></div><div>Formal parameters may be moved to the initialize method. Also function expressions may be used to define a method conditionally:</div><div><br></div><div><div>class MyPoint inherits Point {</div>
<div><br></div><div>  public:</div><div><br></div><div>    function initialize(x, ...args) {</div><div>      this.x = x;</div><div>    }</div><div><br></div><div>    function foo() {</div><div>      super(this.x) + 30</div>
<div>    }</div><div>    </div><div>    // a FE</div><div>    function bar = debug ? (x, y) { ...} : (x) { ... };</div><div>}</div></div><div><br></div><div>P.S.: I mean, if you want a classes-sugar, then it really should be a shugar and use all related things, including code-reuse implemented as delegation based inheritance (thus a prototype may be frozen for static classes and not -- for dynamic).</div>
<div><br></div><div>Dmitry.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>-- <br>    Cheers,<br>    --MarkM<br>
</div>
<br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br>