This gist about ClojureScript

https://gist.github.com/2346460

reminded me of this thread. I need to spend more time learning ClojureScript; maybe someone who knows it has a thought.

/be

Irakli Gozalishvili wrote:
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
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to