I have prototyped desugared version of callable objects here:  

https://gist.github.com/2312621  

I could not use short object syntax and unnamed method as proposed in original 
post, so I used regular object syntax and `new` as method name for unnamed 
`method`. I tried to illustrates that callable objects may be more elegant 
alternative to classes specially in combination with `<|` (which I expressed as 
`extend` function).
Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/


On Wednesday, 2012-04-04 at 24:56 , David Bruant wrote:

> Le 04/04/2012 02:41, Irakli Gozalishvili a écrit :  
> >  
> >  
> > On Tuesday, 2012-04-03 at 14:07 , David Bruant wrote:
> >  
> > > Le 03/04/2012 22:00, Irakli Gozalishvili a écrit :  
> > > > Here is more or less what I have in mind: 
> > > > https://gist.github.com/2295048  
> > > >  
> > > > // class
> > > > var Point = {
> > > >   (x, y) {
> > > >     this.getX = { () { return x; } }
> > > >     this.getY = { () { return x; } }
> > > >   }
> > > >  
> > > >   toString() {
> > > >     return '<' + this.getX() + ',' + this.getY() + '>';
> > > >   }
> > > > }
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > >  
> > > Interesting new function syntax.
> > > The prototype and function body could even be declared together. What 
> > > about 'length'?
> > >  
> > > > Also such callable objects provide shorter alternative to current 
> > > > function syntax:  
> > > > // shorter than function
> > > >  
> > > > numbers.
> > > >   filter({ (x) { return x % 2 } }).
> > > >   // maybe single expression can be even shorter like arrow functions ?
> > > >   map({ (x) x * x }).
> > > >   forEach({ (x) { this.add(x) } }, that);
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > >  
> > > +1
> > >  
> > > > Also this would allow interesting APIs similar to those found in 
> > > > clojure:  
> > > >  
> > > > // maps / sets similar like in clojure ?
> > > > var map = WeakMap(), key = {}, value = {};
> > > >  
> > > > map.set(key, value);
> > > > map(key) // => value
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > > >  
> > >  
> > > So far so good.
> > >  
> > > > key(map) // => value This cannot work for backward-compat reasons. In 
> > > > ES1-5, "key = {}" creates a regular (non-callable) object.
> > >  
> >  
> >  
> > Well I did not suggested it should be backwards compatible, also nor 
> > classes nor shorter object syntax is backwards compatible.  
> They are to the extent that they throw an error for being invalid syntax in 
> previous version. This is the case for your proposal and that's a good thing 
> since that's the back door to introducing new features.
> However, proposals should be backward compatible in semantics.
>  
> In your case:
>  
>     var map = WeakMap(), key = {}, value = {};
>     map.set(key, value);
>     map(key) // => value
>     key(map) // => value
>  
> since key is callable, you have (typeof key === 'function') while ES5 
> requires (typeof key === 'object') for objects that are constructed with 
> '{}'. There is code out there that relies on typeof for argument shifting: 
> 'if the first argument is a function, use that as callback, otherwise, use 
> the second argument (first argument being an option non-callable object)'. 
> There is this pattern all over the place in the mongodb node client as in 
> https://github.com/christkv/node-mongodb-native/blob/master/lib/mongodb/collection.js#L85
> In other cases, to pass a handler, some API check if the argument if an 
> object and in that case use the 'handle' property or use the function is what 
> has been passed is callable.
> So, preserving typeof invariants regarding 'object'/'function' is crucial to 
> backward compatibility.
>  
> Likewise for arrays. In ES1-5, (typeof [] === 'object') and the suggested 
> semantics of your proposal would break that.
>  
> As far as I'm concerned, just the object-literal version of function is a 
> brilliant idea, no need for the additional semantics.
>  
> David

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to