Value Objects, Full Throttle (to be updated for spring TC39 meetings)

Brendan Eich
Brendan EichCEO/President, Brave Software, Inc. at Brave Software, Inc.
Value Objects
Brendan Eich
brendan@mozilla.com
@BrendanEich
!

Ecma TC39 January 2014
Caveats & Pleas

• A review & update from July 2013 TC39 meeting	

• I’m looking for big picture and detailed feedback	

• The big picture matters most at this stage	

• There will be some TypeScript syntax/semantics!	

• Please hold your fire, illustrative & concrete but
could be changed based on other ES7 work	


• These slides are dense, please feel free to ask Qs	

• Not done yet, open issues & imperfections below
Value Objects

• int32, uint32!
• int64, uint64!
• int32x4, int32x8 (SIMD)	

• float32 (to/from Float32Array today)	

• float32x4, float32x8 (SIMD)	

• bignum	

• decimal (long-time TC39 goal: self-hosted extension)	

• rational	

• complex
Overloadable Operators

• | ^ &!
• ==!
• < <=!
• << >> >>>!
• + -!
• * / %!
• unary- unary+

boolean-test!! ~
Preserving Boolean Algebra

•

!= and ! are not overloadable, to preserve

identities including	


•
•
•
•

X ? A : B

<=>

!X ? B : A	


!(X && Y)

<=>

!X || !Y!

!(X || Y)

<=>

!X && !Y	


X != Y

<=>

!(X == Y)
Preserving Relational Relations

•

> and >= are derived from < and <= as

follows:	


•
•

A > B

<=>

B < A	


A >= B

<=>

B <= A	


• We provide <= in addition to < rather than

derive A <= B from !(B < A) in order to
allow the <= overloading to match the same
value object’s == semantics -- and for special
cases, e.g., unordered values (NaNs)
Strict Equality Operators

• The strict equality operators, === and !==,
cannot be overloaded	


• They work on frozen-by-definition value
objects via a structural recursive strict
equality test (beware, NaN !== NaN)	


• Same-object-reference remains a fast-path
optimization
Why Not Double Dispatch?

• Left-first asymmetry (v value, n number):	

•
•

v + n

==>

v.add(n)	


n + v

==>

v.radd(n)!

• Anti-modular: exhaustive other-operand type
enumeration required in operator method
bodies	


• Consequent loss of compositionality:

complex and rational cannot be
composed to make ratplex without

modifying source or wrapping in proxies
Cacheable Multimethods

• Proposed in 2009 by Christian Plesner Hansen
(Google) in es-discuss	


• Avoids double-dispatch drawbacks from last slide:
binary operators implemented by 2-ary functions
for each pair of types	


• Supports Polymorphic Inline Cache (PIC)

optimizations (Christian was on the V8 team)	


• Background reading: [Chambers 1992]
Binary Operator Example

• For v + u with either a value object: !
• Let p = v.[[Get]](@@ADD)	

• If p is not a Set, throw a TypeError	

• Let q = u.[[Get]](@@ADD_R)	

• If q is not a Set, throw a TypeError	

• Let r = p intersect q	

• If r.size != 1 throw a TypeError	

• Let f = r[0]; if f is not a function, throw	

• Evaluate f(v, u) and return the result
API Idea from CPH 2009
// NOTE: NOT PROPOSED FOR ES7	

!
function addPointAndNumber(a, b) {	
return Point(a.x + b, a.y + b);	
}	

!
Function.defineOperator('+', addPointAndNumber, Point, Number);	

!
function addNumberAndPoint(a, b) {	
return Point(a + b.x, a + b.y);	
}	

!
Function.defineOperator('+', addNumberAndPoint, Number, Point);	

!
function addPoints(a, b) {	
return Point(a.x + b.x, a.y + b.y);	
}	

!
Function.defineOperator('+', addPoints, Point, Point);
Literal Syntax

•
•
•
•
•

int64(0)

==>

0L // as in C#!

uint64(0)

==> 0UL // as in C#!

float32(0) ==>

0f // as in C#!

bignum(0)

0n // avoid i/I!

==>

decimal(0) ==>

0m // or M, C/F#!

• We want a syntax extension mechanism, with
declarative not runtime API	


• This means new syntax for operator function
and suffix definition
Value Class Declaration
value class point2d {	
// no suffix	
// default typeof “point2d” (no overriding/spoofing)	

!
constructor(private x: int32, private y: int32) {	
// implicit Object.freeze(this) on return	
}	

!
// binary operators (note arrow shorthand for { return … })	
point2d + number (a, b) => point2d(a.x + b, a.y);	
number + point2d (a, b) => point2d(a + b.x, b.y);	
point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y);	

!
point2d - number (a, b) => point2d(a.x - b, a.y);	
number - point2d (a, b) => point2d(a - b.x, b.y);	
point2d - point2d (a, b) => point2d(a.x - b.x, a.y - b.y);	

!
// more operators with private access elided	
}
Value Class Declaration, cont.
value class pixel {	 // CSS unit, 1/96th of an inch	
	
suffix “px”;	
typeof “CSS:pixel”;	// we allow a lot, but overriding throws	

!
constructor pixel(public twips: int32) {	
// implicit Object.freeze(this) on return	
}	

!
// unary operators (note arrow shorthand for { return … })	
+() => pixel(this.twips);	
-() => pixel(-this.twips);	
!!() => !!this.twips;	
~() => pixel(~this.twips);	
}	

!
value class point {	 // CSS unit, not Cartesian plane point!	
	
suffix “pt”;	
typeof “CSS:point”;	
// constructor and unary operators not shown…	
}
Binary Operator Declaration
value operators {	
// Here number, string, boolean are in scope, and new operator	
// syntax common to value class works.	

!
pixel + number (a, b)
number + pixel (a, b)
pixel + pixel (a, b)
pixel + point (a, b)
point + pixel (a, b)

=>
=>
=>
=>
=>

pixel(a.twips + b * 15);	
pixel(a * 15 + b.twips);	
pixel(a.twips + b.twips);	
pixel(a.twips + b.twips * 20);	
pixel(a.twips * 20 + b.twips);	

pixel - number (a, b)
number - pixel (a, b)
pixel - pixel (a, b)
pixel - point (a, b)
point - pixel (a, b)

=>
=>
=>
=>
=>

pixel(a.twips - b * 15);	
pixel(a * 15 - b.twips);	
pixel(a.twips - b.twips);	
pixel(a.twips - b.twips * 20);	
pixel(a.twips * 20 - b.twips);	

!

!
// etc… (note only public class members)	
}
Value Subclasses
value class point2d {	
constructor point2d(public x: int32, public y: int32) {	
// implicit Object.freeze(this) on return EXCEPT via super	
}	
// call this function f:	
point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y);	
}	

!
value class point3d extends point2d {	
constructor point3d(x: int32, y: int32, public z: int32) {	
super(x, y);	
// implicit Object.freeze(this) on return once, here	
}	
// call this function g:	
point3d + point3d (a, b) => point3d(a.x+b.x, a.y+b.y, a.z+b.z);	
}	

!
// What does point3d(1, 0, 0) + point3d(0, 1, 0) do?	
{f, g} intersect {f, g} => {f, g}, ambiguity error!
Class Precedence via Prototype Depth
// When point2d’s declaration is evaluated:	
let f = point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y);	
point2d.prototype.@@ADD = Set([[1, f]]);	
point2d.prototype.@@ADD_R = Set([[1, f]]);	

!
// When point3d’s declaration is evaluated:	
let g = point3d+point3d (a,b) => point3d(a.x+b.x,a.y+b.y,a.z+b.z);	
point3d.prototype.@@ADD = Set([[1, f], [2, g]]);	
point3d.prototype.@@ADD_R = Set([[1, f], [2, g]]);	

!
// Set notation, please! Here’s what we have at this moment:	
point2d.prototype.@@ADD: {[1, f]}	
point2d.prototype.@@ADD_R: {[1, f]}	
point3d.prototype.@@ADD: {[1, f], [2, g]}	
point3d.prototype.@@ADD_R: {[1, f], [2, g]}	

!
// What does point3d(1, 0, 0) + point3d(0, 1, 0) do?	
{[1,f], [2,g]} intersect {[1,f], [2,g]} => g, more specific wins
The (Other) Frame Problem
// P1: Primitives, e.g. strings, are wrapped via the corresponding	
// scoped constructor/converter function, e.g. String.	
String.prototype.len = function () { return this.length; }	

!
// Suppose otherFrame.str is “LOL”, the primitive string value:	
alert(otherFrame.str.len());	 	 	 	 // 3	

!
// Value objects are objects, that’s the price of extensibility.	
int64.prototype.digits = function () { … }	

!
alert(otherFrame.int64(42).digits())	 // throws, method missing	

!
// P2: As noted last time, cross-frame/realm binary ops fail:	
let three = 1L + otherFrame.int64(2);	 // throws, no such method	

!
//
//
//
//

Possible solutions:	
1. Live with it, frames/realms (should be) more isolated FTW	
2. Proxy as if across a membrane, isolation with mediation FTW	
3. Memoize aggressively (hash-cons); solves P2, not P1 in full
Healing the Old Wounds
// Primitives: built-in magic, not extensible, auto-wrap via scope	
// Reference Objects: user-extensible, conversions not operators	
// Value Objects: by-value semantics; multimethod dyadic operator,	
//
unary operator, suffix, and typeof extensibility	

!
// Idea: enable the JS hacker to bless primitives as value objects	
// and thereby opt into value object operator semantics.	

!
value
value
value
value

class
class
class
class

null;	 	
boolean;	
number;	
	
string;	
	

//
//
//
//

typeof null == “null”	
false != "", true != 1	
42 != "42", 1 != true	
"" != false, “42" != 42, [] + “" throws	

!
// ‘value class string;’ will require explicit .toString() calls!	

!
use value sanity;	 	
	 	 	 	 	 	 	 	

// all of the above, a shorthand; no way to	
// “undeclare”; upgrade your Realm!
Thanks / Q&A
Brendan Eich
brendan@mozilla.com
@BrendanEich
!

Ecma TC39 January 2014
1 of 20

Recommended

Value objects in JS - an ES7 work in progress by
Value objects in JS - an ES7 work in progressValue objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progressBrendan Eich
22.7K views14 slides
Extensible Operators and Literals for JavaScript by
Extensible Operators and Literals for JavaScriptExtensible Operators and Literals for JavaScript
Extensible Operators and Literals for JavaScriptBrendan Eich
6.8K views14 slides
JS Responsibilities by
JS ResponsibilitiesJS Responsibilities
JS ResponsibilitiesBrendan Eich
34.9K views34 slides
Fluent14 by
Fluent14Fluent14
Fluent14Brendan Eich
8.9K views40 slides
Web futures by
Web futuresWeb futures
Web futuresBrendan Eich
8.7K views40 slides
Int64 by
Int64Int64
Int64Brendan Eich
12.8K views17 slides

More Related Content

What's hot

Aspdot by
AspdotAspdot
AspdotNishad Nizarudeen
17 views94 slides
Dynamic Type Inference for Gradual Hindley–Milner Typing by
Dynamic Type Inference for Gradual Hindley–Milner TypingDynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner TypingYusuke Miyazaki
685 views27 slides
Mining Functional Patterns by
Mining Functional PatternsMining Functional Patterns
Mining Functional PatternsDebasish Ghosh
1.8K views49 slides
Monte Carlo C++ by
Monte Carlo C++Monte Carlo C++
Monte Carlo C++Dmitri Nesteruk
765 views19 slides
Optionals by Matt Faluotico by
Optionals by Matt FaluoticoOptionals by Matt Faluotico
Optionals by Matt FaluoticoWithTheBest
246 views35 slides
Algebraic Thinking for Evolution of Pure Functional Domain Models by
Algebraic Thinking for Evolution of Pure Functional Domain ModelsAlgebraic Thinking for Evolution of Pure Functional Domain Models
Algebraic Thinking for Evolution of Pure Functional Domain ModelsDebasish Ghosh
966 views67 slides

What's hot(19)

Dynamic Type Inference for Gradual Hindley–Milner Typing by Yusuke Miyazaki
Dynamic Type Inference for Gradual Hindley–Milner TypingDynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner Typing
Yusuke Miyazaki685 views
Mining Functional Patterns by Debasish Ghosh
Mining Functional PatternsMining Functional Patterns
Mining Functional Patterns
Debasish Ghosh1.8K views
Optionals by Matt Faluotico by WithTheBest
Optionals by Matt FaluoticoOptionals by Matt Faluotico
Optionals by Matt Faluotico
WithTheBest246 views
Algebraic Thinking for Evolution of Pure Functional Domain Models by Debasish Ghosh
Algebraic Thinking for Evolution of Pure Functional Domain ModelsAlgebraic Thinking for Evolution of Pure Functional Domain Models
Algebraic Thinking for Evolution of Pure Functional Domain Models
Debasish Ghosh966 views
Clojure intro by Basav Nagur
Clojure introClojure intro
Clojure intro
Basav Nagur1.4K views
Introducing: A Complete Algebra of Data by Inside Analysis
Introducing: A Complete Algebra of DataIntroducing: A Complete Algebra of Data
Introducing: A Complete Algebra of Data
Inside Analysis1.1K views
Introduction to programming with dependent types in Scala by Dmytro Mitin
Introduction to programming with dependent types in ScalaIntroduction to programming with dependent types in Scala
Introduction to programming with dependent types in Scala
Dmytro Mitin294 views
Constructor and Destructor by Kamal Acharya
Constructor and DestructorConstructor and Destructor
Constructor and Destructor
Kamal Acharya6.3K views

Viewers also liked

Mozilla Research Party Talk by
Mozilla Research Party TalkMozilla Research Party Talk
Mozilla Research Party TalkBrendan Eich
3.1K views33 slides
Containers in a File by
Containers in a FileContainers in a File
Containers in a FileOpenVZ
766 views19 slides
PFcache - LinuxCon 2015 by
PFcache - LinuxCon 2015PFcache - LinuxCon 2015
PFcache - LinuxCon 2015OpenVZ
846 views23 slides
Value Objects by
Value ObjectsValue Objects
Value Objectsbarryosull
865 views15 slides
Values by
ValuesValues
ValuesBenEddy
2.9K views91 slides
Capitol js by
Capitol jsCapitol js
Capitol jsBrendan Eich
4.8K views118 slides

Viewers also liked(20)

Mozilla Research Party Talk by Brendan Eich
Mozilla Research Party TalkMozilla Research Party Talk
Mozilla Research Party Talk
Brendan Eich3.1K views
Containers in a File by OpenVZ
Containers in a FileContainers in a File
Containers in a File
OpenVZ766 views
PFcache - LinuxCon 2015 by OpenVZ
PFcache - LinuxCon 2015PFcache - LinuxCon 2015
PFcache - LinuxCon 2015
OpenVZ846 views
Value Objects by barryosull
Value ObjectsValue Objects
Value Objects
barryosull865 views
Values by BenEddy
ValuesValues
Values
BenEddy2.9K views
Mozilla's NodeConf talk by Brendan Eich
Mozilla's NodeConf talkMozilla's NodeConf talk
Mozilla's NodeConf talk
Brendan Eich3.1K views
Always bet on JS - Finjs.io NYC 2016 by Brendan Eich
Always bet on JS - Finjs.io NYC 2016Always bet on JS - Finjs.io NYC 2016
Always bet on JS - Finjs.io NYC 2016
Brendan Eich1.9K views
Serializing Value Objects-Ara Hacopian by SmartLogic
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara Hacopian
SmartLogic818 views
#pugMi - DDD - Value objects by Simone Gentili
#pugMi - DDD - Value objects#pugMi - DDD - Value objects
#pugMi - DDD - Value objects
Simone Gentili811 views
A System Is Not a Tree by Kevlin Henney
A System Is Not a TreeA System Is Not a Tree
A System Is Not a Tree
Kevlin Henney2.2K views

Similar to Value Objects, Full Throttle (to be updated for spring TC39 meetings)

JavaScript in 2016 by
JavaScript in 2016JavaScript in 2016
JavaScript in 2016Codemotion
636 views65 slides
JavaScript in 2016 (Codemotion Rome) by
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)Eduard Tomàs
1.2K views65 slides
C++ process new by
C++ process newC++ process new
C++ process new敬倫 林
3.4K views82 slides
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр... by
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...GeeksLab Odessa
683 views33 slides
Return of c++ by
Return of c++Return of c++
Return of c++Yongwei Wu
1.1K views44 slides
Memory Management with Java and C++ by
Memory Management with Java and C++Memory Management with Java and C++
Memory Management with Java and C++Mohammad Shaker
2.5K views72 slides

Similar to Value Objects, Full Throttle (to be updated for spring TC39 meetings)(20)

JavaScript in 2016 by Codemotion
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
Codemotion636 views
JavaScript in 2016 (Codemotion Rome) by Eduard Tomàs
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
Eduard Tomàs1.2K views
C++ process new by 敬倫 林
C++ process newC++ process new
C++ process new
敬倫 林3.4K views
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр... by GeeksLab Odessa
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...
Java/Scala Lab: Анатолий Кметюк - Scala SubScript: Алгебра для реактивного пр...
GeeksLab Odessa683 views
Return of c++ by Yongwei Wu
Return of c++Return of c++
Return of c++
Yongwei Wu1.1K views
Memory Management with Java and C++ by Mohammad Shaker
Memory Management with Java and C++Memory Management with Java and C++
Memory Management with Java and C++
Mohammad Shaker2.5K views
C++11: Feel the New Language by mspline
C++11: Feel the New LanguageC++11: Feel the New Language
C++11: Feel the New Language
mspline1.1K views
02 functions, variables, basic input and output of c++ by Manzoor ALam
02   functions, variables, basic input and output of c++02   functions, variables, basic input and output of c++
02 functions, variables, basic input and output of c++
Manzoor ALam920 views
The Present and Future of the Web Platform by C4Media
The Present and Future of the Web PlatformThe Present and Future of the Web Platform
The Present and Future of the Web Platform
C4Media917 views
Replace OutputIterator and Extend Range by Akira Takahashi
Replace OutputIterator and Extend RangeReplace OutputIterator and Extend Range
Replace OutputIterator and Extend Range
Akira Takahashi1.2K views
Denis Lebedev, Swift by Yandex
Denis  Lebedev, SwiftDenis  Lebedev, Swift
Denis Lebedev, Swift
Yandex38.4K views
Modern C++ Lunch and Learn by Paul Irwin
Modern C++ Lunch and LearnModern C++ Lunch and Learn
Modern C++ Lunch and Learn
Paul Irwin1.3K views
The Present and The Future of Functional Programming in C++ by Alexander Granin
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++
Alexander Granin86 views
L10 by lksoo
L10L10
L10
lksoo250 views
Debugging and Profiling C++ Template Metaprograms by Platonov Sergey
Debugging and Profiling C++ Template MetaprogramsDebugging and Profiling C++ Template Metaprograms
Debugging and Profiling C++ Template Metaprograms
Platonov Sergey4.6K views
Writing DSL with Applicative Functors by David Galichet
Writing DSL with Applicative FunctorsWriting DSL with Applicative Functors
Writing DSL with Applicative Functors
David Galichet2.3K views

Recently uploaded

VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueShapeBlue
203 views54 slides
Keynote Talk: Open Source is Not Dead - Charles Schulz - Vates by
Keynote Talk: Open Source is Not Dead - Charles Schulz - VatesKeynote Talk: Open Source is Not Dead - Charles Schulz - Vates
Keynote Talk: Open Source is Not Dead - Charles Schulz - VatesShapeBlue
252 views15 slides
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineShapeBlue
221 views19 slides
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueShapeBlue
263 views23 slides
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue by
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueCloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueShapeBlue
135 views13 slides
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TShapeBlue
152 views34 slides

Recently uploaded(20)

VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue203 views
Keynote Talk: Open Source is Not Dead - Charles Schulz - Vates by ShapeBlue
Keynote Talk: Open Source is Not Dead - Charles Schulz - VatesKeynote Talk: Open Source is Not Dead - Charles Schulz - Vates
Keynote Talk: Open Source is Not Dead - Charles Schulz - Vates
ShapeBlue252 views
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by ShapeBlue
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online
ShapeBlue221 views
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
ShapeBlue263 views
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue by ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlueCloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
CloudStack Managed User Data and Demo - Harikrishna Patnala - ShapeBlue
ShapeBlue135 views
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by ShapeBlue
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
ShapeBlue152 views
Initiating and Advancing Your Strategic GIS Governance Strategy by Safe Software
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance Strategy
Safe Software176 views
Business Analyst Series 2023 - Week 4 Session 8 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 8Business Analyst Series 2023 -  Week 4 Session 8
Business Analyst Series 2023 - Week 4 Session 8
DianaGray10123 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue222 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue126 views
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
ShapeBlue147 views
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT by ShapeBlue
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITUpdates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
ShapeBlue206 views
The Role of Patterns in the Era of Large Language Models by Yunyao Li
The Role of Patterns in the Era of Large Language ModelsThe Role of Patterns in the Era of Large Language Models
The Role of Patterns in the Era of Large Language Models
Yunyao Li85 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker54 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu423 views
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ... by ShapeBlue
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
ShapeBlue166 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue218 views
The Power of Heat Decarbonisation Plans in the Built Environment by IES VE
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built Environment
IES VE79 views
Why and How CloudStack at weSystems - Stephan Bienek - weSystems by ShapeBlue
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsWhy and How CloudStack at weSystems - Stephan Bienek - weSystems
Why and How CloudStack at weSystems - Stephan Bienek - weSystems
ShapeBlue238 views

Value Objects, Full Throttle (to be updated for spring TC39 meetings)

  • 2. Caveats & Pleas • A review & update from July 2013 TC39 meeting • I’m looking for big picture and detailed feedback • The big picture matters most at this stage • There will be some TypeScript syntax/semantics! • Please hold your fire, illustrative & concrete but could be changed based on other ES7 work • These slides are dense, please feel free to ask Qs • Not done yet, open issues & imperfections below
  • 3. Value Objects • int32, uint32! • int64, uint64! • int32x4, int32x8 (SIMD) • float32 (to/from Float32Array today) • float32x4, float32x8 (SIMD) • bignum • decimal (long-time TC39 goal: self-hosted extension) • rational • complex
  • 4. Overloadable Operators • | ^ &! • ==! • < <=! • << >> >>>! • + -! • * / %! • unary- unary+ boolean-test!! ~
  • 5. Preserving Boolean Algebra • != and ! are not overloadable, to preserve identities including • • • • X ? A : B <=> !X ? B : A !(X && Y) <=> !X || !Y! !(X || Y) <=> !X && !Y X != Y <=> !(X == Y)
  • 6. Preserving Relational Relations • > and >= are derived from < and <= as follows: • • A > B <=> B < A A >= B <=> B <= A • We provide <= in addition to < rather than derive A <= B from !(B < A) in order to allow the <= overloading to match the same value object’s == semantics -- and for special cases, e.g., unordered values (NaNs)
  • 7. Strict Equality Operators • The strict equality operators, === and !==, cannot be overloaded • They work on frozen-by-definition value objects via a structural recursive strict equality test (beware, NaN !== NaN) • Same-object-reference remains a fast-path optimization
  • 8. Why Not Double Dispatch? • Left-first asymmetry (v value, n number): • • v + n ==> v.add(n) n + v ==> v.radd(n)! • Anti-modular: exhaustive other-operand type enumeration required in operator method bodies • Consequent loss of compositionality: complex and rational cannot be composed to make ratplex without modifying source or wrapping in proxies
  • 9. Cacheable Multimethods • Proposed in 2009 by Christian Plesner Hansen (Google) in es-discuss • Avoids double-dispatch drawbacks from last slide: binary operators implemented by 2-ary functions for each pair of types • Supports Polymorphic Inline Cache (PIC) optimizations (Christian was on the V8 team) • Background reading: [Chambers 1992]
  • 10. Binary Operator Example • For v + u with either a value object: ! • Let p = v.[[Get]](@@ADD) • If p is not a Set, throw a TypeError • Let q = u.[[Get]](@@ADD_R) • If q is not a Set, throw a TypeError • Let r = p intersect q • If r.size != 1 throw a TypeError • Let f = r[0]; if f is not a function, throw • Evaluate f(v, u) and return the result
  • 11. API Idea from CPH 2009 // NOTE: NOT PROPOSED FOR ES7 ! function addPointAndNumber(a, b) { return Point(a.x + b, a.y + b); } ! Function.defineOperator('+', addPointAndNumber, Point, Number); ! function addNumberAndPoint(a, b) { return Point(a + b.x, a + b.y); } ! Function.defineOperator('+', addNumberAndPoint, Number, Point); ! function addPoints(a, b) { return Point(a.x + b.x, a.y + b.y); } ! Function.defineOperator('+', addPoints, Point, Point);
  • 12. Literal Syntax • • • • • int64(0) ==> 0L // as in C#! uint64(0) ==> 0UL // as in C#! float32(0) ==> 0f // as in C#! bignum(0) 0n // avoid i/I! ==> decimal(0) ==> 0m // or M, C/F#! • We want a syntax extension mechanism, with declarative not runtime API • This means new syntax for operator function and suffix definition
  • 13. Value Class Declaration value class point2d { // no suffix // default typeof “point2d” (no overriding/spoofing) ! constructor(private x: int32, private y: int32) { // implicit Object.freeze(this) on return } ! // binary operators (note arrow shorthand for { return … }) point2d + number (a, b) => point2d(a.x + b, a.y); number + point2d (a, b) => point2d(a + b.x, b.y); point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y); ! point2d - number (a, b) => point2d(a.x - b, a.y); number - point2d (a, b) => point2d(a - b.x, b.y); point2d - point2d (a, b) => point2d(a.x - b.x, a.y - b.y); ! // more operators with private access elided }
  • 14. Value Class Declaration, cont. value class pixel { // CSS unit, 1/96th of an inch suffix “px”; typeof “CSS:pixel”; // we allow a lot, but overriding throws ! constructor pixel(public twips: int32) { // implicit Object.freeze(this) on return } ! // unary operators (note arrow shorthand for { return … }) +() => pixel(this.twips); -() => pixel(-this.twips); !!() => !!this.twips; ~() => pixel(~this.twips); } ! value class point { // CSS unit, not Cartesian plane point! suffix “pt”; typeof “CSS:point”; // constructor and unary operators not shown… }
  • 15. Binary Operator Declaration value operators { // Here number, string, boolean are in scope, and new operator // syntax common to value class works. ! pixel + number (a, b) number + pixel (a, b) pixel + pixel (a, b) pixel + point (a, b) point + pixel (a, b) => => => => => pixel(a.twips + b * 15); pixel(a * 15 + b.twips); pixel(a.twips + b.twips); pixel(a.twips + b.twips * 20); pixel(a.twips * 20 + b.twips); pixel - number (a, b) number - pixel (a, b) pixel - pixel (a, b) pixel - point (a, b) point - pixel (a, b) => => => => => pixel(a.twips - b * 15); pixel(a * 15 - b.twips); pixel(a.twips - b.twips); pixel(a.twips - b.twips * 20); pixel(a.twips * 20 - b.twips); ! ! // etc… (note only public class members) }
  • 16. Value Subclasses value class point2d { constructor point2d(public x: int32, public y: int32) { // implicit Object.freeze(this) on return EXCEPT via super } // call this function f: point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y); } ! value class point3d extends point2d { constructor point3d(x: int32, y: int32, public z: int32) { super(x, y); // implicit Object.freeze(this) on return once, here } // call this function g: point3d + point3d (a, b) => point3d(a.x+b.x, a.y+b.y, a.z+b.z); } ! // What does point3d(1, 0, 0) + point3d(0, 1, 0) do? {f, g} intersect {f, g} => {f, g}, ambiguity error!
  • 17. Class Precedence via Prototype Depth // When point2d’s declaration is evaluated: let f = point2d + point2d (a, b) => point2d(a.x + b.x, a.y + b.y); point2d.prototype.@@ADD = Set([[1, f]]); point2d.prototype.@@ADD_R = Set([[1, f]]); ! // When point3d’s declaration is evaluated: let g = point3d+point3d (a,b) => point3d(a.x+b.x,a.y+b.y,a.z+b.z); point3d.prototype.@@ADD = Set([[1, f], [2, g]]); point3d.prototype.@@ADD_R = Set([[1, f], [2, g]]); ! // Set notation, please! Here’s what we have at this moment: point2d.prototype.@@ADD: {[1, f]} point2d.prototype.@@ADD_R: {[1, f]} point3d.prototype.@@ADD: {[1, f], [2, g]} point3d.prototype.@@ADD_R: {[1, f], [2, g]} ! // What does point3d(1, 0, 0) + point3d(0, 1, 0) do? {[1,f], [2,g]} intersect {[1,f], [2,g]} => g, more specific wins
  • 18. The (Other) Frame Problem // P1: Primitives, e.g. strings, are wrapped via the corresponding // scoped constructor/converter function, e.g. String. String.prototype.len = function () { return this.length; } ! // Suppose otherFrame.str is “LOL”, the primitive string value: alert(otherFrame.str.len()); // 3 ! // Value objects are objects, that’s the price of extensibility. int64.prototype.digits = function () { … } ! alert(otherFrame.int64(42).digits()) // throws, method missing ! // P2: As noted last time, cross-frame/realm binary ops fail: let three = 1L + otherFrame.int64(2); // throws, no such method ! // // // // Possible solutions: 1. Live with it, frames/realms (should be) more isolated FTW 2. Proxy as if across a membrane, isolation with mediation FTW 3. Memoize aggressively (hash-cons); solves P2, not P1 in full
  • 19. Healing the Old Wounds // Primitives: built-in magic, not extensible, auto-wrap via scope // Reference Objects: user-extensible, conversions not operators // Value Objects: by-value semantics; multimethod dyadic operator, // unary operator, suffix, and typeof extensibility ! // Idea: enable the JS hacker to bless primitives as value objects // and thereby opt into value object operator semantics. ! value value value value class class class class null; boolean; number; string; // // // // typeof null == “null” false != "", true != 1 42 != "42", 1 != true "" != false, “42" != 42, [] + “" throws ! // ‘value class string;’ will require explicit .toString() calls! ! use value sanity; // all of the above, a shorthand; no way to // “undeclare”; upgrade your Realm!
  • 20. Thanks / Q&A Brendan Eich brendan@mozilla.com @BrendanEich ! Ecma TC39 January 2014