SlideShare a Scribd company logo
FunScript
 Zach Bray 2013
Me

           • Energy trading systems
           • C#/F#/C++
           • Functional
                           zbray.com
                            @zbray

* Lots of F#
* Calculation Engine
* Not a JS expert
What is FunScript?

              // F# Code -> JavaScript Code
              Compiler.Compile: Expr -> string




* F# Code -> JS Code
* Quotation Expr -> String
* Quotations in F# provide a way of getting the AST from a piece of code.
What does it support?

          • Most F# code
          • A little mscorlib
          • 400+ bootstrapped tests


* Bootstrapped: FSharp.PowerPack + JInt
Primitives

           • Strings
           • Numbers (beware!)
           • Booleans


* Ints/Bytes/etc. all converted to number.
* Loops that look infinite can turn out to be finite...
Flow
                                                            var _temp1;
                                                            if (x)
              let y =                                       {
                                                               _temp1 = "foo";
                if x then "foo"                             }
                                                            else
                else "bar"                                  {
                                                               _temp1 = "bar";
              y                                             };
                                                            var y = _temp1;
                                                            return y;


                                                            var xs = List_CreateCons(1.000000,
                                                            List_CreateCons(2.000000,
                                                            List_CreateCons(3.000000,
                                                            List_Empty())));
          let xs = [1; 2; 3]                                if ((xs.Tag == "Cons"))
                                                            {
          match xs with                                       var _xs = List_Tail(xs);
                                                              var x = List_Head(xs);
          | x::xs -> x                                        return x;
                                                            }
          | _ -> failwith "never"                           else
                                                            {
                                                              throw ("never");
                                                            }




*   Inline if... then... else... blocks
*   Pattern matching
*   While + For loops
*   Caveat: Quotation Problem: “for x in xs” when xs is an array
Functions
                                                  var isOdd = (function (x)

       let isOdd x = x % 2 <> 0                   {
                                                    return ((x % 2.000000).CompareTo(0.000000) != 0.000000);

       isOdd 2                                    });
                                                  return isOdd(2.000000);




                                                return (function (x)
                                                {
       (fun x -> x % 2 = 0)(2)                      return ((x % 2.000000).CompareTo(0.000000) == 0.000000);
                                                })(2.000000);




* Let bound functions
* Anonymous lambda functions
* Note/Caveat: CompareTo rather than operators: Allows structural equality. Has negative
impact on performance. Cite: Mandelbrot test by Carsten Koenig 100x worse than JS vs.
1000x for Fay.
Records
        type Person =                                     var i_Person__ctor;
                                                          i_Person__ctor = (function (Name, Age)
          { Name: string; Age: int }                      {
                                                            this.Name = Name;
        let bob =                                           this.Age = Age;
                                                          });
          { Name = "Bob"; Age = 25 }                      var bob = (new i_Person__ctor("Bob", 25.000000));




                                                          var now = (new i_Person__ctor("Bob", 25.000000));
    let now = { Name = "Bob"; Age = 25 }                  var _temp1;
                                                          var Age = 26.000000;
    let soon = { now with Age = 26 }                      _temp1 = (new i_Person__ctor(now.Name, Age));
                                                          var soon = _temp1;




        ...but also discriminated unions, classes and modules


*   Most of the types you can define
*   Records, DUs, Classes, Modules
*   Records very similar to JSON.
*   Record expressions are shallow copies with some changes
*   Records & DUs have structural equality.
*   Caveat: Class inheritance doesn’t work (yet)
*   Caveat: DU structural equality is broken on the main branch.
Operators
        let xs = [10 .. 20]                            var xs = Seq_ToList(Range_oneStep(10.000000, 20.000000));




     let xs = [10 .. 2 .. 20]                    var xs = Seq_ToList(Range_customStep(10.000000, 2.000000, 20.000000));




                                                                        var incr = (function (x)
         let incr x = x + 1                                             {
                                                                          return (x + 1.000000);
         let x = 10                                                     });
                                                                        var x = 10.000000;
         x |> incr                                                      return incr(x)




                                                                       var incr = (function (x)
                                                                       {
                                                                         return (x + 1.000000);
                                                                       });
       let incr x = x + 1.                                             var divBy2 = (function (x)
                                                                       {
       let divBy2 x = x / 2.                                             return (x / 2.000000);
                                                                       });
       (incr << divBy2) 10.                                            return (function (x)
                                                                       {
                                                                         return incr(divBy2(x));
                                                                       })(10.000000);




*   Logic & Arithmetic too (obviously)
*   But also... identity, ignore, defaultArg, reference assignment etc.
*   Can also define your own.
*   See the tests for a complete list.
Computation
                        expressions

                                                  return (function (arg00)
                                                  {
                                                    return Async_StartImmediate(arg00, {Tag: "None"});
                                                  })((function (builder_)
       async { return () }                        {
                                                    return builder_.Delay((function (unitVar)
       |> Async.StartImmediate                      {
                                                      var _temp3;
                                                      return builder_.Return(_temp3);
                                                    }));
                                                  })(Async_get_async()));




* Async workflow built in...
* Can define your own too, e.g., the maybe monad if you wanted it
* LiveScript has the concept of back calls
Data structures
• Array
• List
• Seq
• Map
• Set
• Option
Bored yet?




Boring bit over (hopefully).
We’re half way to the pub.
Why bother?
Enormous number of devices. More than .Net or Mono.
Not just for the browser.
* Desktop Apps.
* Tablet/Phone Apps.
* Servers.
Don’t we have this
                      already?
           • FSWebTools
           • WebSharper
           • Pit
           • JSIL

F# has a long history of compiling to JavaScript
Tomas released FSWebTools back in 2006 or 07.
CoffeeScript appeared in 2009.
But FunScript is focusing on something slightly different...
Extensibility




We cannot port the whole framework.
... but we can give you the tools to chip off the bits you need.
Movie data example




Tomas built this web app with FunScript.
No .NET the whole thing runs in JS.
* Who is familar with type providers?
* Like code gen, but without the manual step and can be lazy (which is great for stuff like
freebase)...
Mapping the Apiary.io
                    type provider
               • Makes calls to the framework
               • Not quotation friendly
               • We replace (or re-route) the calls to
                    quotation friendly methods and types
    ExpressionReplacer.createUnsafe <@ ApiaryDocument.Create @> <@ JsonProvider.JsRuntime.CreateDocument @>
    ExpressionReplacer.createUnsafe <@ fun (d:ApiaryDocument) -> d.JsonValue @> <@ JsonProvider.JsRuntime.Identity @>
    ExpressionReplacer.createUnsafe <@ fun (d:ApiaryDocument) -> d.Context @> <@ getContext @>




       Compiler.Compile(<@ page() @>, components=FunScript.Data.Components.DataProviders)




*   We cannot use the provider out of the box...
*   But because the compiler is EXTENSIBLE we can tell it how to convert those calls.
*   It [the compiler] will find all call sites and change them.
*   Then we can use the provider in our JavaScript output
*   Any questions on that?
* OK so...
* That’s one feature that existing implementations don’t have.
* What else?
What about these?




                                                                      Elm

                              See: http://altjs.org/
* Many languages target JavaScript now.
* It has become a kind of IL.
* Some are quite good. I recommend LiveScript if you don’t mind something dynamic.
Dynamically typed
             •   Good at interop

             •   But if its too close to
                 JavaScript...




*   Can reuse existing libraries
*   Can consume JS data
*   But...
*   Inconsistent operations (annoying on forms)
*   Dodgy for ... in ... loops, although fixed in most compile to JS languages
*   Dodgy function scope. Yuck!
*   Counter-intuitive “Falsey” values
*   Auto semi-colon insertion
Statically typed:
                          FFI sucks




*   Foreign function interface
*   Have to map every function you want to use
*   Tedious and error prone - may as well go dynamic
*   This is Fay. But same in Roy, js_of_ocaml, etc.
*   Can do this in FunScript too.
The Lonely Island




* If you have to use FFI you are a lonely island
* Cannot easily access any of the existing JavaScript infrastructure
Bypass FFI with type
                   providers




* Uses similar techniques to those I described in the Movie example
* The TypeScript library creates a bunch of types and tells the compiler how to turn them into
JavaScript.
* F# is the only language that supports this workflow at the moment!
Just the beginning

           • TypeScript only has mappings for 10s of
               JavaScript libraries.
           • Google Closure annotations
           • JavaScript type inferrer


* Google closure might provide many more mappings
* JavaScript type inferrer would probably be very hard to build but it would be awesome

- EDIT: Colin Bull has already made a little progress towards this: https://github.com/
colinbull/IronJS/commit/612b799351a37d720920d4c68797787d2b72aaca
- EDIT: We could even have a type provider to the node package manager (NPM) then we
wouldn’t even need to mess around with files. For example:

type npmProvider = NodePacakgeManager()
let npm = npmProvider.GetContext()
let express = npm.express.v3_1_2
let connect = npm.connect.v2_7_2
...
GitHub numbers


                                                                       •    JavaScript: #1


                                                                       •    FSharp: #43




                                                   Sources:
                                         www.github.com/languages/
                      www.r-chart.com/2010/08/github-stats-on-programming-languages.html
So this is the sell...
Why should you go out and build me a JavaScript type inferrer...
21% of the projects on GitHub are _labelled_ as JavaScript
2010-2012: http://t.arboreus.com/post/31469214663/visualizing-changes-in-popularity-rankings-of




* This is how the popularity of programming languages has changed (according to fairly
arbitrary measures) in the last two years.
* JavaScript is still on top.
LinkedIn numbers
 JavaScript                     F#


 914,000 people              2,000 people




                  in scale
Thanks to the
          FunScript contributors
           • Tomas Petricek
           • Phillip Trelford
           • James Freiwirth
           • Robert Pickering
           • Steffen Forkmann

If you’d like to contribute come and talk to me afterwards.
Summary

• FunScript compiles F# into JavaScript
• It is extensible: re-route any method call
• F# is the only statically typed language (that

           capable of taking advantage of
  I’m aware of)

  JavaScript libraries without FFI or code-gen
Questions?

More Related Content

KEY
ddd+scala
ODP
1.2 scala basics
PDF
From Java to Scala - advantages and possible risks
PDF
LetSwift RxSwift 시작하기
PDF
响应式编程及框架
PDF
Scala for Jedi
PDF
A bit about Scala
PDF
The Ring programming language version 1.5.2 book - Part 30 of 181
ddd+scala
1.2 scala basics
From Java to Scala - advantages and possible risks
LetSwift RxSwift 시작하기
响应式编程及框架
Scala for Jedi
A bit about Scala
The Ring programming language version 1.5.2 book - Part 30 of 181

What's hot (20)

DOCX
Useful functions for arrays in php
PPT
SDC - Einführung in Scala
PDF
The Ring programming language version 1.2 book - Part 20 of 84
PDF
Swift for TensorFlow - CoreML Personalization
PDF
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
PDF
Scala vs Java 8 in a Java 8 World
PDF
oop presentation note
PDF
Grammarware Memes
PDF
Haskell in the Real World
PDF
Swift rocks! #1
PDF
Common derivatives integrals_reduced
PDF
Lesson 8: Basic Differentiation Rules
PDF
Java Cheat Sheet
PDF
The Ring programming language version 1.5.1 book - Part 29 of 180
PDF
The Macronomicon
PDF
Calculus Cheat Sheet All
PDF
Lesson 8: Basic Differentiation Rules
PDF
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
PDF
Swift Rocks #2: Going functional
PDF
Calculus cheat sheet_integrals
Useful functions for arrays in php
SDC - Einführung in Scala
The Ring programming language version 1.2 book - Part 20 of 84
Swift for TensorFlow - CoreML Personalization
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
Scala vs Java 8 in a Java 8 World
oop presentation note
Grammarware Memes
Haskell in the Real World
Swift rocks! #1
Common derivatives integrals_reduced
Lesson 8: Basic Differentiation Rules
Java Cheat Sheet
The Ring programming language version 1.5.1 book - Part 29 of 180
The Macronomicon
Calculus Cheat Sheet All
Lesson 8: Basic Differentiation Rules
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Swift Rocks #2: Going functional
Calculus cheat sheet_integrals
Ad

Viewers also liked (8)

PDF
dpi24/7, la plateforme de publication digitale pour les groupes de presse
PPTX
JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...
PPTX
La centrale d'achat dédiée aux petites entreprises
PDF
PremiumPeers la plateforme collaborative de conseil en transformation
PPTX
My Web intelligence - Une plateforme open source au service des humanités dig...
PDF
Fondamentaux du marketing digital
PDF
Strategie de communication digitale Clarins
PDF
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
dpi24/7, la plateforme de publication digitale pour les groupes de presse
JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...
La centrale d'achat dédiée aux petites entreprises
PremiumPeers la plateforme collaborative de conseil en transformation
My Web intelligence - Une plateforme open source au service des humanités dig...
Fondamentaux du marketing digital
Strategie de communication digitale Clarins
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Ad

Similar to FunScript 2013 (with speakers notes) (20)

PPTX
F# Eye For The C# Guy - Seattle 2013
PPTX
FP Day 2011 - Turning to the Functional Side (using C# & F#)
PDF
CoffeeScript
PPTX
Javascript best practices
PDF
FSharp Talk
PDF
Modern Application Foundations: Underscore and Twitter Bootstrap
PPTX
Reasonable Code With Fsharp
PDF
Types and Immutability: why you should care
PDF
Javascript Uncommon Programming
PDF
front-end dev
PPTX
PPTX
F# Presentation
PDF
Functional Programming in F#
PPTX
PPTX
ACM Distinguished Program: Cooperative Testing and Analysis: Human-Tool, Tool...
PPTX
Tech Days Paris Intoduction F# and Collective Intelligence
PDF
ECMAScript 6 major changes
PDF
Introduction to ECMAScript 2015
DOC
optimization process on compiler
PDF
CoffeeScript - JavaScript in a simple way
F# Eye For The C# Guy - Seattle 2013
FP Day 2011 - Turning to the Functional Side (using C# & F#)
CoffeeScript
Javascript best practices
FSharp Talk
Modern Application Foundations: Underscore and Twitter Bootstrap
Reasonable Code With Fsharp
Types and Immutability: why you should care
Javascript Uncommon Programming
front-end dev
F# Presentation
Functional Programming in F#
ACM Distinguished Program: Cooperative Testing and Analysis: Human-Tool, Tool...
Tech Days Paris Intoduction F# and Collective Intelligence
ECMAScript 6 major changes
Introduction to ECMAScript 2015
optimization process on compiler
CoffeeScript - JavaScript in a simple way

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Encapsulation theory and applications.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Spectroscopy.pptx food analysis technology
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
Cloud computing and distributed systems.
20250228 LYD VKU AI Blended-Learning.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Programs and apps: productivity, graphics, security and other tools
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Digital-Transformation-Roadmap-for-Companies.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Review of recent advances in non-invasive hemoglobin estimation
Encapsulation theory and applications.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Spectroscopy.pptx food analysis technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
“AI and Expert System Decision Support & Business Intelligence Systems”
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
NewMind AI Weekly Chronicles - August'25 Week I
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Cloud computing and distributed systems.

FunScript 2013 (with speakers notes)

  • 2. Me • Energy trading systems • C#/F#/C++ • Functional zbray.com @zbray * Lots of F# * Calculation Engine * Not a JS expert
  • 3. What is FunScript? // F# Code -> JavaScript Code Compiler.Compile: Expr -> string * F# Code -> JS Code * Quotation Expr -> String * Quotations in F# provide a way of getting the AST from a piece of code.
  • 4. What does it support? • Most F# code • A little mscorlib • 400+ bootstrapped tests * Bootstrapped: FSharp.PowerPack + JInt
  • 5. Primitives • Strings • Numbers (beware!) • Booleans * Ints/Bytes/etc. all converted to number. * Loops that look infinite can turn out to be finite...
  • 6. Flow var _temp1; if (x) let y = { _temp1 = "foo"; if x then "foo" } else else "bar" { _temp1 = "bar"; y }; var y = _temp1; return y; var xs = List_CreateCons(1.000000, List_CreateCons(2.000000, List_CreateCons(3.000000, List_Empty()))); let xs = [1; 2; 3] if ((xs.Tag == "Cons")) { match xs with var _xs = List_Tail(xs); var x = List_Head(xs); | x::xs -> x return x; } | _ -> failwith "never" else { throw ("never"); } * Inline if... then... else... blocks * Pattern matching * While + For loops * Caveat: Quotation Problem: “for x in xs” when xs is an array
  • 7. Functions var isOdd = (function (x) let isOdd x = x % 2 <> 0 { return ((x % 2.000000).CompareTo(0.000000) != 0.000000); isOdd 2 }); return isOdd(2.000000); return (function (x) { (fun x -> x % 2 = 0)(2) return ((x % 2.000000).CompareTo(0.000000) == 0.000000); })(2.000000); * Let bound functions * Anonymous lambda functions * Note/Caveat: CompareTo rather than operators: Allows structural equality. Has negative impact on performance. Cite: Mandelbrot test by Carsten Koenig 100x worse than JS vs. 1000x for Fay.
  • 8. Records type Person = var i_Person__ctor; i_Person__ctor = (function (Name, Age) { Name: string; Age: int } { this.Name = Name; let bob = this.Age = Age; }); { Name = "Bob"; Age = 25 } var bob = (new i_Person__ctor("Bob", 25.000000)); var now = (new i_Person__ctor("Bob", 25.000000)); let now = { Name = "Bob"; Age = 25 } var _temp1; var Age = 26.000000; let soon = { now with Age = 26 } _temp1 = (new i_Person__ctor(now.Name, Age)); var soon = _temp1; ...but also discriminated unions, classes and modules * Most of the types you can define * Records, DUs, Classes, Modules * Records very similar to JSON. * Record expressions are shallow copies with some changes * Records & DUs have structural equality. * Caveat: Class inheritance doesn’t work (yet) * Caveat: DU structural equality is broken on the main branch.
  • 9. Operators let xs = [10 .. 20] var xs = Seq_ToList(Range_oneStep(10.000000, 20.000000)); let xs = [10 .. 2 .. 20] var xs = Seq_ToList(Range_customStep(10.000000, 2.000000, 20.000000)); var incr = (function (x) let incr x = x + 1 { return (x + 1.000000); let x = 10 }); var x = 10.000000; x |> incr return incr(x) var incr = (function (x) { return (x + 1.000000); }); let incr x = x + 1. var divBy2 = (function (x) { let divBy2 x = x / 2. return (x / 2.000000); }); (incr << divBy2) 10. return (function (x) { return incr(divBy2(x)); })(10.000000); * Logic & Arithmetic too (obviously) * But also... identity, ignore, defaultArg, reference assignment etc. * Can also define your own. * See the tests for a complete list.
  • 10. Computation expressions return (function (arg00) { return Async_StartImmediate(arg00, {Tag: "None"}); })((function (builder_) async { return () } { return builder_.Delay((function (unitVar) |> Async.StartImmediate { var _temp3; return builder_.Return(_temp3); })); })(Async_get_async())); * Async workflow built in... * Can define your own too, e.g., the maybe monad if you wanted it * LiveScript has the concept of back calls
  • 11. Data structures • Array • List • Seq • Map • Set • Option
  • 12. Bored yet? Boring bit over (hopefully). We’re half way to the pub.
  • 14. Enormous number of devices. More than .Net or Mono.
  • 15. Not just for the browser. * Desktop Apps. * Tablet/Phone Apps. * Servers.
  • 16. Don’t we have this already? • FSWebTools • WebSharper • Pit • JSIL F# has a long history of compiling to JavaScript Tomas released FSWebTools back in 2006 or 07. CoffeeScript appeared in 2009. But FunScript is focusing on something slightly different...
  • 17. Extensibility We cannot port the whole framework. ... but we can give you the tools to chip off the bits you need.
  • 18. Movie data example Tomas built this web app with FunScript. No .NET the whole thing runs in JS.
  • 19. * Who is familar with type providers? * Like code gen, but without the manual step and can be lazy (which is great for stuff like freebase)...
  • 20. Mapping the Apiary.io type provider • Makes calls to the framework • Not quotation friendly • We replace (or re-route) the calls to quotation friendly methods and types ExpressionReplacer.createUnsafe <@ ApiaryDocument.Create @> <@ JsonProvider.JsRuntime.CreateDocument @> ExpressionReplacer.createUnsafe <@ fun (d:ApiaryDocument) -> d.JsonValue @> <@ JsonProvider.JsRuntime.Identity @> ExpressionReplacer.createUnsafe <@ fun (d:ApiaryDocument) -> d.Context @> <@ getContext @> Compiler.Compile(<@ page() @>, components=FunScript.Data.Components.DataProviders) * We cannot use the provider out of the box... * But because the compiler is EXTENSIBLE we can tell it how to convert those calls. * It [the compiler] will find all call sites and change them. * Then we can use the provider in our JavaScript output * Any questions on that?
  • 21. * OK so... * That’s one feature that existing implementations don’t have. * What else?
  • 22. What about these? Elm See: http://altjs.org/ * Many languages target JavaScript now. * It has become a kind of IL. * Some are quite good. I recommend LiveScript if you don’t mind something dynamic.
  • 23. Dynamically typed • Good at interop • But if its too close to JavaScript... * Can reuse existing libraries * Can consume JS data * But... * Inconsistent operations (annoying on forms) * Dodgy for ... in ... loops, although fixed in most compile to JS languages * Dodgy function scope. Yuck! * Counter-intuitive “Falsey” values * Auto semi-colon insertion
  • 24. Statically typed: FFI sucks * Foreign function interface * Have to map every function you want to use * Tedious and error prone - may as well go dynamic * This is Fay. But same in Roy, js_of_ocaml, etc. * Can do this in FunScript too.
  • 25. The Lonely Island * If you have to use FFI you are a lonely island * Cannot easily access any of the existing JavaScript infrastructure
  • 26. Bypass FFI with type providers * Uses similar techniques to those I described in the Movie example * The TypeScript library creates a bunch of types and tells the compiler how to turn them into JavaScript. * F# is the only language that supports this workflow at the moment!
  • 27. Just the beginning • TypeScript only has mappings for 10s of JavaScript libraries. • Google Closure annotations • JavaScript type inferrer * Google closure might provide many more mappings * JavaScript type inferrer would probably be very hard to build but it would be awesome - EDIT: Colin Bull has already made a little progress towards this: https://github.com/ colinbull/IronJS/commit/612b799351a37d720920d4c68797787d2b72aaca - EDIT: We could even have a type provider to the node package manager (NPM) then we wouldn’t even need to mess around with files. For example: type npmProvider = NodePacakgeManager() let npm = npmProvider.GetContext() let express = npm.express.v3_1_2 let connect = npm.connect.v2_7_2 ...
  • 28. GitHub numbers • JavaScript: #1 • FSharp: #43 Sources: www.github.com/languages/ www.r-chart.com/2010/08/github-stats-on-programming-languages.html So this is the sell... Why should you go out and build me a JavaScript type inferrer... 21% of the projects on GitHub are _labelled_ as JavaScript
  • 29. 2010-2012: http://t.arboreus.com/post/31469214663/visualizing-changes-in-popularity-rankings-of * This is how the popularity of programming languages has changed (according to fairly arbitrary measures) in the last two years. * JavaScript is still on top.
  • 30. LinkedIn numbers JavaScript F# 914,000 people 2,000 people in scale
  • 31. Thanks to the FunScript contributors • Tomas Petricek • Phillip Trelford • James Freiwirth • Robert Pickering • Steffen Forkmann If you’d like to contribute come and talk to me afterwards.
  • 32. Summary • FunScript compiles F# into JavaScript • It is extensible: re-route any method call • F# is the only statically typed language (that capable of taking advantage of I’m aware of) JavaScript libraries without FFI or code-gen