Beautiful!

- I would leave typeof as it is. But there should be a proposal for a strategy 
on how to clean up the whole instanceof/typeof mess. Possibilities: just a set 
of best practices, a new operator, etc.

- There should be literals for ints, but I would have at most two kinds – for 
whatever is considered most common, e.g.:
    let a = -123i; // int
    let b = -123l; // long
   Rationale: There are only a few ways in which integers are normally used, 
those should be convenient, especially for newbies. In contract, for scientific 
computing, bignum(500) should not be a problem.


On Mar 20, 2012, at 5:04 , David Herman wrote:

> I had a great conversation today with my colleagues Michael Bebenita and 
> Shu-Yu Guo, and we came up with what I think is a nicely conservative way to 
> add new kinds of numbers to JS without breaking the intuition that JS has 
> only one type of primitive numbers.
> 
> tl;dr: Pure, immutable objects that can be optimized to unboxed integers.
> 
> Examples:
> 
>    let x = uint64(17);
>    let y = uint64(17);
>    console.log(x === y)            // true
>    console.log(typeof x)           // "object"
>    console.log(Object.isValue(x))  // true
>    console.log(Object.isValue({})) // false
> 
>    function factorial(n) {
>        return n <= 1 ? bignum(1) : n * factorial(n - 1);
>    }
> 
>    console.log(factorial(bignum(500)));
>    // 122013682599111006870123878542304692625357434280319284219241
>    // 358838584537315388199760549644750220328186301361647714820358
>    // 416337872207817720048078520515932928547790757193933060377296
>    // 085908627042917454788242491272634430567017327076946106280231
>    // 045264421887878946575477714986349436778103764427403382736539
>    // 747138647787849543848959553753799042324106127132698432774571
>    // 554630997720278101456108118837370953101635632443298702956389
>    // 662891165897476957208792692887128178007026517450776841071962
>    // 439039432253642260523494585012991857150124870696156814162535
>    // 905669342381300885624924689156412677565448188650659384795177
>    // 536089400574523894033579847636394490531306232374906644504882
>    // 466507594673586207463792518420045936969298102226397195259719
>    // 094521782333175693458150855233282076282002340262690789834245
>    // 171200620771464097945611612762914595123722991334016955236385
>    // 094288559201872743379517301458635757082835578015873543276888
>    // 868012039988238470215146760544540766353598417443048012893831
>    // 389688163948746965881750450692636533817505547812864000000000
>    // 000000000000000000000000000000000000000000000000000000000000
>    // 0000000000000000000000000000000000000000000000000000000
> 
> By defining new object types that are immutable, implementations are free to 
> choose among many representations. They can copy the data or share references 
> whenever they want. Since the integers encapsulate only their bits, 
> optimizing implementations can use a 64-bit integer payload. And fully 
> unboxed representations can literally be 64 bit integers (at least, in 
> optimized code where types have been properly inferred). Finally, it's 
> possible to partially evaluate constructors like
> 
>    uint64(17)
> 
> because the constructor is pure. So even if we didn't have custom literal 
> syntax like 17u64 (which, incidentally, we could), we should still be able to 
> get the same performance.
> 
> This proposal involves one major change in semantics: the built-in operators 
> have to be overloaded to handle the new types. Rather than go all the way 
> towards user-defined value types, though, I've stuck for now with just a 
> fixed set of built-in ones. It's forward-compatible with user-defined 
> overloading, in case we ever wanted to go all the way.
> 
> But the nice thing is, since they are all just objects, there's no shame in 
> having a multiplicity of new types, including:
> 
> * uint8, int8
> * uint16, int16
> * uint32, int32
> * uint64, int64 <-- hey everyone, look at this, this is the important part, 
> right here
> * bignums
> * IEEE754r decimal
> * complex numbers (if anyone cares?)
> * exact rationals (a bridge too far?)
> 
> For all of these, the answer to `typeof` is still just "object". For the most 
> part, they just feel like a nice "batteries included" library.
> 
> There's a rough draft of the strawman here:
> 
>    http://wiki.ecmascript.org/doku.php?id=strawman:value_objects
> 
> Comments welcome!
> 
> Dave
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
> 

-- 
Dr. Axel Rauschmayer
[email protected]

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to