SlideShare a Scribd company logo
Community-driven design:
|> in TC39
Daniel Ehrenberg @littledan
Igalia, in partnership with Bloomberg
TC39 delegate
WorkerConf 2018
Method chaining:
Awesome, right?
const cities = [
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
{ name: "Valencia", population: 790000 }
];
const cities = [
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
{ name: "Valencia", population: 790000 }
];
cities.filter(city => city.population > 1000000);
===>
[
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
]
const cities = [
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
{ name: "Valencia", population: 790000 }
];
cities.filter(city => city.population > 1000000)
.sort((a, b) => a.population - b.population);
===>
[
{ name: "Barcelona", population: 1609000 },
{ name: "Madrid", population: 3166000 },
]
const cities = [
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
{ name: "Valencia", population: 790000 }
];
cities.filter(city => city.population > 1000000)
.sort((a, b) => a.population - b.population)
.map(city => city.name);
===>
["Barcelona", "Madrid"]
OK, let's make our own!
function sortByPop(arr) {
return arr.sort(
(a, b) => a.population - b.population);
}
sortByPop(cities.filter(
city => city.population > 1000000))
.map(city => city.name);
Array.prototype.sortByPop = function () {
return this.sort(
(a, b) => a.population - b.population);
}
const cities = [
{ name: "Madrid", population: 3166000 },
{ name: "Barcelona", population: 1609000 },
{ name: "Valencia", population: 790000 }
];
cities.filter(city => city.population > 1000000)
.sortByPop()
.map(city => city.name);
Combining modules
cities.js
// Highest population cities
Array.prototype.sortByPop =
function () {
return this.sort((a, b) =>
a.population - b.population);
}
export function bigCities(cities) {
return cities.filter(city =>
city.population > 1000000)
.sortByPop()
.map(city => city.name);
}
combined.js
import { bigCities } from "cities.js";
import { manyFans } from "music.js";
// CLASH
music.js
// Most popular musicians
Array.prototype.sortByPop =
function () {
return this.sort((a, b) =>
a.popularity - b.popularity);
}
export function manyFans(musicians) { … }
function sortByPop(arr) {
return arr.sort(
(a, b) => a.population - b.population);
}
sortByPop(cities.filter(
city => city.population > 1000000))
.map(city => city.name);
function sortByPop() {
return this.sort(
(a, b) => a.population - b.population);
}
const cities = // ...
cities.filter(city => city.population > 1000000)
::sortByPop()
.map(city => city.name);
function f(x) {
// ...
}
// Bind operator
obj::f(x)
===>
f.call(obj, x)
Maybe soon!
We are looking into it
Pipeline/bind is at Stage 1
// ES6 Destructuring Assignment
let x = 1, y = 2;
[y, x] = [x, y];
⇒ x === 2
y === 1
Who is TC39?
● A committee of Ecma, with…
● JS developers
● Implementers
● Frameworks
● Academics
● etc
Meetings
● Every two months
● For three days
● Summarize/review GitHub activity
● Move proposals through stages
TC39 stages
● Stage 1: An idea
● Stage 2: Agreed-on first draft
● Stage 3: Details worked out
● Stage 4: Battle-tested and standard
History of ::
● Discussed :: in 2012 and earlier
● Developed by Dave Herman, Kevin Smith
● Implemented in Babel, 2015 by Ingvar Stepanyan
● Deferred until post-ES6
this ??!!?!?!?!
library.js
export function doubleSay(str) {
return str + ", " + str;
}
export function capitalize(str) {
return str[0].toUpperCase() +
str.substring(1);
}
export function exclaim(str) {
return str + "!";
}
with-pipeline.js
import { doubleSay, capitalize, exclaim }
from "library.js";
let result = "hello"
|> doubleSay
|> capitalize
|> exclaim;
// ===> "Hello, hello!"
ordinary.js
import { doubleSay, capitalize, exclaim }
from "library.js";
let result =
exclaim(capitalize(doubleSay("hello")));
// ===> "Hello, hello!"
History of |>
● Gilbert created |> repository, November 2015
● Reached Stage 1, September 2017
● Implemented in Babel, late 2017
by Henry Zhu, Justin Ridgewell
● Pursue two paths, March 2018
Async/await integration
Example
function doubleSay (str) {
return str + ", " + str;
}
function capitalize (str) {
return str[0].toUpperCase() +
str.substring(1);
}
function exclaim (str) {
return str + '!';
}
...the following invocations are equivalent:
let result = exclaim(capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = "hello"
|> doubleSay
|> capitalize
|> exclaim;
result //=> "Hello, hello!"
Evolving to async...
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(capitalize(
doubleSay("hello")));
result //=> [Object Promise]!
let result = "hello"
|> doubleSay
|> capitalize
|> exclaim;
result //=> [Object Promise]!
Oops, how can we fix it?
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(await capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = ("hello"
|> doubleSay
|> capitalize)
.then(exclaim);
result //=> resolves to “Hello”
Or, this would also work
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(await capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = await (
"hello"
|> doubleSay
|> capitalize)
|> exclaim;
result //=> "Hello, hello!"
A prettier solution (PR; proposed for C#)
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(await capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = "hello"
|> doubleSay
|> await capitalize
|> exclaim;
result //=> "Hello, hello!"
However, this would be different…
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(await capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = "hello"
|> doubleSay
|> (await capitalize)
|> exclaim;
result //=> [Object Promise]!
Another nice solution
function doubleSay (str) {
return str + ", " + str;
}
async function capitalize (str) {
let response = await
capitalizeOnTheServer(str);
return response.getCapitalized();
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(await capitalize(
doubleSay("hello")));
result //=> "Hello, hello!"
let result = "hello"
|> doubleSay
|> capitalize
|> await
|> exclaim;
result //=> "Hello, hello!"
Plan from here
● Pursue two options ("F#" and "smart pipeline")
● Write specifications and documentation
● Implement both in Babel, different flags
● Develop community consensus on F#, smart, and ::
● Propose a choice to TC39
Steps needed for Stage 2
● First draft spec text ✔
● Decide which variant …
● Agreement that we want the proposal …
Steps needed for Stage 3
● Complete spec text …
● Signoff from reviewers, editor …
● Ready to pass off to native implementers …
Steps needed for Stage 4
● Two implementations …
● Conformance tests …
● PR with editor signoff …
Getting involved
Feedback on GitHub issues
● Does this work for you?
● Missing pieces?
● Handle a case differently?
Pipeline GitHub feedback
● Proposal scope
● :: vs |>
● Await integration
● Avoiding currying
● Semantic details
Test262 tests
● Tests shared between JS engines
● “If it’s not tested, it’s not compatible”
● Finds edge cases
Pipeline test262 tests
● ...None yet
● Could be useful for Babel development
● Wanna help?
Documentation/Education
● Explain the feature to contributors, learners
● Understand mental models for JS
Pipeline documentation
● "Explainer documents" for each variant
● Wanted: Better introductory materials
● Wanted: Educators' perspective on the alternatives
Implementation
● Open-source projects accepting contributions:
○ Babel
○ TypeScript
○ V8
○ Acorn
● Features developed behind a flag/in a plugin
○ JSC
○ ChakraCore
○ SpiderMonkey
○ And many more
Pipeline implementations
● Babel transforms
● Want to write more?
Attending TC39 as a delegate
● Join Ecma to come to TC39 meetings
● Contact me for more info, littledan@igalia.com
● Get involved in TC39:
https://tc39.github.io/
● |> is at Stage 1
for compositional chaining
● Daniel Ehrenberg
● Twitter/GitHub @littledan
● littledan@igalia.com

More Related Content

What's hot

CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35
Bilal Ahmed
 
vbscript-reference book
vbscript-reference bookvbscript-reference book
vbscript-reference book
Anand Dhana
 
2014-11-01 01 Денис Нелюбин. О сортах кофе
2014-11-01 01 Денис Нелюбин. О сортах кофе2014-11-01 01 Денис Нелюбин. О сортах кофе
2014-11-01 01 Денис Нелюбин. О сортах кофе
Омские ИТ-субботники
 
C++ classes tutorials
C++ classes tutorialsC++ classes tutorials
C++ classes tutorials
Mayank Jain
 
Scheme 核心概念(一)
Scheme 核心概念(一)Scheme 核心概念(一)
Scheme 核心概念(一)
維然 柯維然
 
Groovify your java code by hervé roussel
Groovify your java code by hervé rousselGroovify your java code by hervé roussel
Groovify your java code by hervé roussel
Hervé Vũ Roussel
 
Web futures
Web futuresWeb futures
Web futures
Brendan Eich
 
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Brendan Eich
 
Logging in JavaScript - Part-3
Logging in JavaScript - Part-3Logging in JavaScript - Part-3
Logging in JavaScript - Part-3
Ideas2IT Technologies
 
FunctionalJS - George Shevtsov
FunctionalJS - George ShevtsovFunctionalJS - George Shevtsov
FunctionalJS - George Shevtsov
Georgiy Shevtsov
 
Cs practical file
Cs practical fileCs practical file
Cs practical file
Shailendra Garg
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
John De Goes
 
TypeScript by Howard
TypeScript by HowardTypeScript by Howard
TypeScript by Howard
LearningTech
 
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
Muhammad Hammad Waseem
 
Type script by Howard
Type script by HowardType script by Howard
Type script by Howard
LearningTech
 
Typelevel summit
Typelevel summitTypelevel summit
Typelevel summit
Marina Sigaeva
 

What's hot (16)

CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35CS101- Introduction to Computing- Lecture 35
CS101- Introduction to Computing- Lecture 35
 
vbscript-reference book
vbscript-reference bookvbscript-reference book
vbscript-reference book
 
2014-11-01 01 Денис Нелюбин. О сортах кофе
2014-11-01 01 Денис Нелюбин. О сортах кофе2014-11-01 01 Денис Нелюбин. О сортах кофе
2014-11-01 01 Денис Нелюбин. О сортах кофе
 
C++ classes tutorials
C++ classes tutorialsC++ classes tutorials
C++ classes tutorials
 
Scheme 核心概念(一)
Scheme 核心概念(一)Scheme 核心概念(一)
Scheme 核心概念(一)
 
Groovify your java code by hervé roussel
Groovify your java code by hervé rousselGroovify your java code by hervé roussel
Groovify your java code by hervé roussel
 
Web futures
Web futuresWeb futures
Web futures
 
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
 
Logging in JavaScript - Part-3
Logging in JavaScript - Part-3Logging in JavaScript - Part-3
Logging in JavaScript - Part-3
 
FunctionalJS - George Shevtsov
FunctionalJS - George ShevtsovFunctionalJS - George Shevtsov
FunctionalJS - George Shevtsov
 
Cs practical file
Cs practical fileCs practical file
Cs practical file
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
 
TypeScript by Howard
TypeScript by HowardTypeScript by Howard
TypeScript by Howard
 
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
 
Type script by Howard
Type script by HowardType script by Howard
Type script by Howard
 
Typelevel summit
Typelevel summitTypelevel summit
Typelevel summit
 

Similar to Community-driven Language Design at TC39 on the JavaScript Pipeline Operator (WorkerConf 2018)

Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to Javascript
Anjan Banda
 
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Igalia
 
Day 1
Day 1Day 1
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
tdc-globalcode
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
Giovanni Bassi
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf Edition
Paulo Morgado
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
Christian Nagel
 
2 BytesC++ course_2014_c3_ function basics&parameters and overloading
2 BytesC++ course_2014_c3_ function basics&parameters and overloading2 BytesC++ course_2014_c3_ function basics&parameters and overloading
2 BytesC++ course_2014_c3_ function basics&parameters and overloading
kinan keshkeh
 
C++ manual Report Full
C++ manual Report FullC++ manual Report Full
C++ manual Report Full
Thesis Scientist Private Limited
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
Vikas Sharma
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
AOE
 
CppTutorial.ppt
CppTutorial.pptCppTutorial.ppt
CppTutorial.ppt
HODZoology3
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»
SpbDotNet Community
 
C++ process new
C++ process newC++ process new
C++ process new
敬倫 林
 
C# 6.0 - April 2014 preview
C# 6.0 - April 2014 previewC# 6.0 - April 2014 preview
C# 6.0 - April 2014 preview
Paulo Morgado
 
Introduction to typescript
Introduction to typescriptIntroduction to typescript
Introduction to typescript
Mario Alexandro Santini
 
Intro to Akka Streams
Intro to Akka StreamsIntro to Akka Streams
Intro to Akka Streams
Michael Kendra
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
Juan Pablo
 
C++ theory
C++ theoryC++ theory
C++ theory
Shyam Khant
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the Horizon
Alex Payne
 

Similar to Community-driven Language Design at TC39 on the JavaScript Pipeline Operator (WorkerConf 2018) (20)

Intro to Javascript
Intro to JavascriptIntro to Javascript
Intro to Javascript
 
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
 
Day 1
Day 1Day 1
Day 1
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf Edition
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
 
2 BytesC++ course_2014_c3_ function basics&parameters and overloading
2 BytesC++ course_2014_c3_ function basics&parameters and overloading2 BytesC++ course_2014_c3_ function basics&parameters and overloading
2 BytesC++ course_2014_c3_ function basics&parameters and overloading
 
C++ manual Report Full
C++ manual Report FullC++ manual Report Full
C++ manual Report Full
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
CppTutorial.ppt
CppTutorial.pptCppTutorial.ppt
CppTutorial.ppt
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»
 
C++ process new
C++ process newC++ process new
C++ process new
 
C# 6.0 - April 2014 preview
C# 6.0 - April 2014 previewC# 6.0 - April 2014 preview
C# 6.0 - April 2014 preview
 
Introduction to typescript
Introduction to typescriptIntroduction to typescript
Introduction to typescript
 
Intro to Akka Streams
Intro to Akka StreamsIntro to Akka Streams
Intro to Akka Streams
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
 
C++ theory
C++ theoryC++ theory
C++ theory
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the Horizon
 

More from Igalia

A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
Igalia
 
Building End-user Applications on Embedded Devices with WPE
Building End-user Applications on Embedded Devices with WPEBuilding End-user Applications on Embedded Devices with WPE
Building End-user Applications on Embedded Devices with WPE
Igalia
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Igalia
 
Automated Testing for Web-based Systems on Embedded Devices
Automated Testing for Web-based Systems on Embedded DevicesAutomated Testing for Web-based Systems on Embedded Devices
Automated Testing for Web-based Systems on Embedded Devices
Igalia
 
Embedding WPE WebKit - from Bring-up to Maintenance
Embedding WPE WebKit - from Bring-up to MaintenanceEmbedding WPE WebKit - from Bring-up to Maintenance
Embedding WPE WebKit - from Bring-up to Maintenance
Igalia
 
Optimizing Scheduler for Linux Gaming.pdf
Optimizing Scheduler for Linux Gaming.pdfOptimizing Scheduler for Linux Gaming.pdf
Optimizing Scheduler for Linux Gaming.pdf
Igalia
 
Running JS via WASM faster with JIT
Running JS via WASM      faster with JITRunning JS via WASM      faster with JIT
Running JS via WASM faster with JIT
Igalia
 
To crash or not to crash: if you do, at least recover fast!
To crash or not to crash: if you do, at least recover fast!To crash or not to crash: if you do, at least recover fast!
To crash or not to crash: if you do, at least recover fast!
Igalia
 
Implementing a Vulkan Video Encoder From Mesa to GStreamer
Implementing a Vulkan Video Encoder From Mesa to GStreamerImplementing a Vulkan Video Encoder From Mesa to GStreamer
Implementing a Vulkan Video Encoder From Mesa to GStreamer
Igalia
 
8 Years of Open Drivers, including the State of Vulkan in Mesa
8 Years of Open Drivers, including the State of Vulkan in Mesa8 Years of Open Drivers, including the State of Vulkan in Mesa
8 Years of Open Drivers, including the State of Vulkan in Mesa
Igalia
 
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por IgaliaIntroducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
Igalia
 
2023 in Chimera Linux
2023 in Chimera                    Linux2023 in Chimera                    Linux
2023 in Chimera Linux
Igalia
 
Building a Linux distro with LLVM
Building a Linux distro        with LLVMBuilding a Linux distro        with LLVM
Building a Linux distro with LLVM
Igalia
 
turnip: Update on Open Source Vulkan Driver for Adreno GPUs
turnip: Update on Open Source Vulkan Driver for Adreno GPUsturnip: Update on Open Source Vulkan Driver for Adreno GPUs
turnip: Update on Open Source Vulkan Driver for Adreno GPUs
Igalia
 
Graphics stack updates for Raspberry Pi devices
Graphics stack updates for Raspberry Pi devicesGraphics stack updates for Raspberry Pi devices
Graphics stack updates for Raspberry Pi devices
Igalia
 
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOSDelegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
Igalia
 
MessageFormat: The future of i18n on the web
MessageFormat: The future of i18n on the webMessageFormat: The future of i18n on the web
MessageFormat: The future of i18n on the web
Igalia
 
Replacing the geometry pipeline with mesh shaders
Replacing the geometry pipeline with mesh shadersReplacing the geometry pipeline with mesh shaders
Replacing the geometry pipeline with mesh shaders
Igalia
 
I'm not an AMD expert, but...
I'm not an AMD expert, but...I'm not an AMD expert, but...
I'm not an AMD expert, but...
Igalia
 
Status of Vulkan on Raspberry
Status of Vulkan on RaspberryStatus of Vulkan on Raspberry
Status of Vulkan on Raspberry
Igalia
 

More from Igalia (20)

A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Building End-user Applications on Embedded Devices with WPE
Building End-user Applications on Embedded Devices with WPEBuilding End-user Applications on Embedded Devices with WPE
Building End-user Applications on Embedded Devices with WPE
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Automated Testing for Web-based Systems on Embedded Devices
Automated Testing for Web-based Systems on Embedded DevicesAutomated Testing for Web-based Systems on Embedded Devices
Automated Testing for Web-based Systems on Embedded Devices
 
Embedding WPE WebKit - from Bring-up to Maintenance
Embedding WPE WebKit - from Bring-up to MaintenanceEmbedding WPE WebKit - from Bring-up to Maintenance
Embedding WPE WebKit - from Bring-up to Maintenance
 
Optimizing Scheduler for Linux Gaming.pdf
Optimizing Scheduler for Linux Gaming.pdfOptimizing Scheduler for Linux Gaming.pdf
Optimizing Scheduler for Linux Gaming.pdf
 
Running JS via WASM faster with JIT
Running JS via WASM      faster with JITRunning JS via WASM      faster with JIT
Running JS via WASM faster with JIT
 
To crash or not to crash: if you do, at least recover fast!
To crash or not to crash: if you do, at least recover fast!To crash or not to crash: if you do, at least recover fast!
To crash or not to crash: if you do, at least recover fast!
 
Implementing a Vulkan Video Encoder From Mesa to GStreamer
Implementing a Vulkan Video Encoder From Mesa to GStreamerImplementing a Vulkan Video Encoder From Mesa to GStreamer
Implementing a Vulkan Video Encoder From Mesa to GStreamer
 
8 Years of Open Drivers, including the State of Vulkan in Mesa
8 Years of Open Drivers, including the State of Vulkan in Mesa8 Years of Open Drivers, including the State of Vulkan in Mesa
8 Years of Open Drivers, including the State of Vulkan in Mesa
 
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por IgaliaIntroducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
Introducción a Mesa. Caso específico dos dispositivos Raspberry Pi por Igalia
 
2023 in Chimera Linux
2023 in Chimera                    Linux2023 in Chimera                    Linux
2023 in Chimera Linux
 
Building a Linux distro with LLVM
Building a Linux distro        with LLVMBuilding a Linux distro        with LLVM
Building a Linux distro with LLVM
 
turnip: Update on Open Source Vulkan Driver for Adreno GPUs
turnip: Update on Open Source Vulkan Driver for Adreno GPUsturnip: Update on Open Source Vulkan Driver for Adreno GPUs
turnip: Update on Open Source Vulkan Driver for Adreno GPUs
 
Graphics stack updates for Raspberry Pi devices
Graphics stack updates for Raspberry Pi devicesGraphics stack updates for Raspberry Pi devices
Graphics stack updates for Raspberry Pi devices
 
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOSDelegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
Delegated Compositing - Utilizing Wayland Protocols for Chromium on ChromeOS
 
MessageFormat: The future of i18n on the web
MessageFormat: The future of i18n on the webMessageFormat: The future of i18n on the web
MessageFormat: The future of i18n on the web
 
Replacing the geometry pipeline with mesh shaders
Replacing the geometry pipeline with mesh shadersReplacing the geometry pipeline with mesh shaders
Replacing the geometry pipeline with mesh shaders
 
I'm not an AMD expert, but...
I'm not an AMD expert, but...I'm not an AMD expert, but...
I'm not an AMD expert, but...
 
Status of Vulkan on Raspberry
Status of Vulkan on RaspberryStatus of Vulkan on Raspberry
Status of Vulkan on Raspberry
 

Recently uploaded

Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
panagenda
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Project Management Semester Long Project - Acuity
Project Management Semester Long Project - AcuityProject Management Semester Long Project - Acuity
Project Management Semester Long Project - Acuity
jpupo2018
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Mariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceXMariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceX
Mariano Tinti
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Speck&Tech
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
kumardaparthi1024
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
fredae14
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 

Recently uploaded (20)

Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Project Management Semester Long Project - Acuity
Project Management Semester Long Project - AcuityProject Management Semester Long Project - Acuity
Project Management Semester Long Project - Acuity
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Mariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceXMariano G Tinti - Decoding SpaceX
Mariano G Tinti - Decoding SpaceX
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 

Community-driven Language Design at TC39 on the JavaScript Pipeline Operator (WorkerConf 2018)

  • 1. Community-driven design: |> in TC39 Daniel Ehrenberg @littledan Igalia, in partnership with Bloomberg TC39 delegate WorkerConf 2018
  • 3. const cities = [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, { name: "Valencia", population: 790000 } ];
  • 4. const cities = [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, { name: "Valencia", population: 790000 } ]; cities.filter(city => city.population > 1000000); ===> [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, ]
  • 5. const cities = [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, { name: "Valencia", population: 790000 } ]; cities.filter(city => city.population > 1000000) .sort((a, b) => a.population - b.population); ===> [ { name: "Barcelona", population: 1609000 }, { name: "Madrid", population: 3166000 }, ]
  • 6. const cities = [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, { name: "Valencia", population: 790000 } ]; cities.filter(city => city.population > 1000000) .sort((a, b) => a.population - b.population) .map(city => city.name); ===> ["Barcelona", "Madrid"]
  • 7. OK, let's make our own!
  • 8. function sortByPop(arr) { return arr.sort( (a, b) => a.population - b.population); } sortByPop(cities.filter( city => city.population > 1000000)) .map(city => city.name);
  • 9. Array.prototype.sortByPop = function () { return this.sort( (a, b) => a.population - b.population); } const cities = [ { name: "Madrid", population: 3166000 }, { name: "Barcelona", population: 1609000 }, { name: "Valencia", population: 790000 } ]; cities.filter(city => city.population > 1000000) .sortByPop() .map(city => city.name);
  • 11. cities.js // Highest population cities Array.prototype.sortByPop = function () { return this.sort((a, b) => a.population - b.population); } export function bigCities(cities) { return cities.filter(city => city.population > 1000000) .sortByPop() .map(city => city.name); } combined.js import { bigCities } from "cities.js"; import { manyFans } from "music.js"; // CLASH music.js // Most popular musicians Array.prototype.sortByPop = function () { return this.sort((a, b) => a.popularity - b.popularity); } export function manyFans(musicians) { … }
  • 12. function sortByPop(arr) { return arr.sort( (a, b) => a.population - b.population); } sortByPop(cities.filter( city => city.population > 1000000)) .map(city => city.name);
  • 13. function sortByPop() { return this.sort( (a, b) => a.population - b.population); } const cities = // ... cities.filter(city => city.population > 1000000) ::sortByPop() .map(city => city.name);
  • 14. function f(x) { // ... } // Bind operator obj::f(x) ===> f.call(obj, x)
  • 15.
  • 16. Maybe soon! We are looking into it Pipeline/bind is at Stage 1
  • 17. // ES6 Destructuring Assignment let x = 1, y = 2; [y, x] = [x, y]; ⇒ x === 2 y === 1
  • 18. Who is TC39? ● A committee of Ecma, with… ● JS developers ● Implementers ● Frameworks ● Academics ● etc
  • 19.
  • 20.
  • 21. Meetings ● Every two months ● For three days ● Summarize/review GitHub activity ● Move proposals through stages
  • 22. TC39 stages ● Stage 1: An idea ● Stage 2: Agreed-on first draft ● Stage 3: Details worked out ● Stage 4: Battle-tested and standard
  • 23. History of :: ● Discussed :: in 2012 and earlier ● Developed by Dave Herman, Kevin Smith ● Implemented in Babel, 2015 by Ingvar Stepanyan ● Deferred until post-ES6
  • 24.
  • 26. library.js export function doubleSay(str) { return str + ", " + str; } export function capitalize(str) { return str[0].toUpperCase() + str.substring(1); } export function exclaim(str) { return str + "!"; } with-pipeline.js import { doubleSay, capitalize, exclaim } from "library.js"; let result = "hello" |> doubleSay |> capitalize |> exclaim; // ===> "Hello, hello!" ordinary.js import { doubleSay, capitalize, exclaim } from "library.js"; let result = exclaim(capitalize(doubleSay("hello"))); // ===> "Hello, hello!"
  • 27. History of |> ● Gilbert created |> repository, November 2015 ● Reached Stage 1, September 2017 ● Implemented in Babel, late 2017 by Henry Zhu, Justin Ridgewell ● Pursue two paths, March 2018
  • 29. Example function doubleSay (str) { return str + ", " + str; } function capitalize (str) { return str[0].toUpperCase() + str.substring(1); } function exclaim (str) { return str + '!'; } ...the following invocations are equivalent: let result = exclaim(capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = "hello" |> doubleSay |> capitalize |> exclaim; result //=> "Hello, hello!"
  • 30. Evolving to async... function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(capitalize( doubleSay("hello"))); result //=> [Object Promise]! let result = "hello" |> doubleSay |> capitalize |> exclaim; result //=> [Object Promise]!
  • 31. Oops, how can we fix it? function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(await capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = ("hello" |> doubleSay |> capitalize) .then(exclaim); result //=> resolves to “Hello”
  • 32. Or, this would also work function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(await capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = await ( "hello" |> doubleSay |> capitalize) |> exclaim; result //=> "Hello, hello!"
  • 33. A prettier solution (PR; proposed for C#) function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(await capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = "hello" |> doubleSay |> await capitalize |> exclaim; result //=> "Hello, hello!"
  • 34. However, this would be different… function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(await capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = "hello" |> doubleSay |> (await capitalize) |> exclaim; result //=> [Object Promise]!
  • 35. Another nice solution function doubleSay (str) { return str + ", " + str; } async function capitalize (str) { let response = await capitalizeOnTheServer(str); return response.getCapitalized(); } function exclaim (str) { return str + '!'; } let result = exclaim(await capitalize( doubleSay("hello"))); result //=> "Hello, hello!" let result = "hello" |> doubleSay |> capitalize |> await |> exclaim; result //=> "Hello, hello!"
  • 36. Plan from here ● Pursue two options ("F#" and "smart pipeline") ● Write specifications and documentation ● Implement both in Babel, different flags ● Develop community consensus on F#, smart, and :: ● Propose a choice to TC39
  • 37. Steps needed for Stage 2 ● First draft spec text ✔ ● Decide which variant … ● Agreement that we want the proposal …
  • 38. Steps needed for Stage 3 ● Complete spec text … ● Signoff from reviewers, editor … ● Ready to pass off to native implementers …
  • 39. Steps needed for Stage 4 ● Two implementations … ● Conformance tests … ● PR with editor signoff …
  • 41. Feedback on GitHub issues ● Does this work for you? ● Missing pieces? ● Handle a case differently?
  • 42. Pipeline GitHub feedback ● Proposal scope ● :: vs |> ● Await integration ● Avoiding currying ● Semantic details
  • 43. Test262 tests ● Tests shared between JS engines ● “If it’s not tested, it’s not compatible” ● Finds edge cases
  • 44.
  • 45. Pipeline test262 tests ● ...None yet ● Could be useful for Babel development ● Wanna help?
  • 46. Documentation/Education ● Explain the feature to contributors, learners ● Understand mental models for JS
  • 47. Pipeline documentation ● "Explainer documents" for each variant ● Wanted: Better introductory materials ● Wanted: Educators' perspective on the alternatives
  • 48. Implementation ● Open-source projects accepting contributions: ○ Babel ○ TypeScript ○ V8 ○ Acorn ● Features developed behind a flag/in a plugin ○ JSC ○ ChakraCore ○ SpiderMonkey ○ And many more
  • 49. Pipeline implementations ● Babel transforms ● Want to write more?
  • 50. Attending TC39 as a delegate ● Join Ecma to come to TC39 meetings ● Contact me for more info, littledan@igalia.com
  • 51. ● Get involved in TC39: https://tc39.github.io/ ● |> is at Stage 1 for compositional chaining ● Daniel Ehrenberg ● Twitter/GitHub @littledan ● littledan@igalia.com