SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
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?

Mais conteúdo relacionado

Mais procurados

Useful functions for arrays in php
Useful functions for arrays in phpUseful functions for arrays in php
Useful functions for arrays in phpChetan Patel
 
The Ring programming language version 1.2 book - Part 20 of 84
The Ring programming language version 1.2 book - Part 20 of 84The Ring programming language version 1.2 book - Part 20 of 84
The Ring programming language version 1.2 book - Part 20 of 84Mahmoud Samir Fayed
 
Swift for TensorFlow - CoreML Personalization
Swift for TensorFlow - CoreML PersonalizationSwift for TensorFlow - CoreML Personalization
Swift for TensorFlow - CoreML PersonalizationJacopo Mangiavacchi
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation streamRuslan Shevchenko
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldBTI360
 
oop presentation note
oop presentation note oop presentation note
oop presentation note Atit Patumvan
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real Worldosfameron
 
Swift rocks! #1
Swift rocks! #1Swift rocks! #1
Swift rocks! #1Hackraft
 
Common derivatives integrals_reduced
Common derivatives integrals_reducedCommon derivatives integrals_reduced
Common derivatives integrals_reducedKyro Fitkry
 
Lesson 8: Basic Differentiation Rules
Lesson 8: Basic Differentiation RulesLesson 8: Basic Differentiation Rules
Lesson 8: Basic Differentiation RulesMatthew Leingang
 
The Ring programming language version 1.5.1 book - Part 29 of 180
The Ring programming language version 1.5.1 book - Part 29 of 180The Ring programming language version 1.5.1 book - Part 29 of 180
The Ring programming language version 1.5.1 book - Part 29 of 180Mahmoud Samir Fayed
 
The Macronomicon
The MacronomiconThe Macronomicon
The MacronomiconMike Fogus
 
Calculus Cheat Sheet All
Calculus Cheat Sheet AllCalculus Cheat Sheet All
Calculus Cheat Sheet AllMoe Han
 
Lesson 8: Basic Differentiation Rules
Lesson 8: Basic Differentiation RulesLesson 8: Basic Differentiation Rules
Lesson 8: Basic Differentiation RulesMatthew Leingang
 
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...scalaconfjp
 
Swift Rocks #2: Going functional
Swift Rocks #2: Going functionalSwift Rocks #2: Going functional
Swift Rocks #2: Going functionalHackraft
 
Calculus cheat sheet_integrals
Calculus cheat sheet_integralsCalculus cheat sheet_integrals
Calculus cheat sheet_integralsUrbanX4
 

Mais procurados (20)

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

Destaque

dpi24/7, la plateforme de publication digitale pour les groupes de presse
dpi24/7, la plateforme de publication digitale pour les groupes de pressedpi24/7, la plateforme de publication digitale pour les groupes de presse
dpi24/7, la plateforme de publication digitale pour les groupes de presseAudaxis
 
JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...
JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...
JahiaOne 2015 - Belambra: the customer testomonial by Pierre Brahy and Pierre...Jahia Solutions Group
 
La centrale d'achat dédiée aux petites entreprises
La centrale d'achat dédiée aux petites entreprisesLa centrale d'achat dédiée aux petites entreprises
La centrale d'achat dédiée aux petites entreprisesCEFAC
 
PremiumPeers la plateforme collaborative de conseil en transformation
PremiumPeers la plateforme collaborative de conseil en transformationPremiumPeers la plateforme collaborative de conseil en transformation
PremiumPeers la plateforme collaborative de conseil en transformationComePinchart
 
My Web intelligence - Une plateforme open source au service des humanités dig...
My Web intelligence - Une plateforme open source au service des humanités dig...My Web intelligence - Une plateforme open source au service des humanités dig...
My Web intelligence - Une plateforme open source au service des humanités dig...Amar LAKEL, PhD
 
Fondamentaux du marketing digital
Fondamentaux du marketing digitalFondamentaux du marketing digital
Fondamentaux du marketing digitalTojuma consulting
 
Strategie de communication digitale Clarins
Strategie de communication digitale ClarinsStrategie de communication digitale Clarins
Strategie de communication digitale ClarinsSylvie Nourry
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
 

Destaque (8)

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

Semelhante a FunScript 2013 (with speakers notes)

Javascript Uncommon Programming
Javascript Uncommon ProgrammingJavascript Uncommon Programming
Javascript Uncommon Programmingjeffz
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in RustIngvar Stepanyan
 
Jscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptJscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptjeffz
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)jeffz
 
Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that LetterKevlin Henney
 
深入浅出Jscex
深入浅出Jscex深入浅出Jscex
深入浅出Jscexjeffz
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scaladjspiewak
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)Hiroki Mizuno
 
Coffee Scriptでenchant.js
Coffee Scriptでenchant.jsCoffee Scriptでenchant.js
Coffee Scriptでenchant.jsNaoyuki Totani
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming iiPrashant Kalkar
 
03. haskell refresher quiz
03. haskell refresher quiz03. haskell refresher quiz
03. haskell refresher quizSebastian Rettig
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?Tomasz Wrobel
 
Strinng Classes in c++
Strinng Classes in c++Strinng Classes in c++
Strinng Classes in c++Vikash Dhal
 
Principles of functional progrmming in scala
Principles of functional progrmming in scalaPrinciples of functional progrmming in scala
Principles of functional progrmming in scalaehsoon
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsEelco Visser
 
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐาน
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐานภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐาน
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐานNoppanon YourJust'one
 

Semelhante a FunScript 2013 (with speakers notes) (20)

Javascript Uncommon Programming
Javascript Uncommon ProgrammingJavascript Uncommon Programming
Javascript Uncommon Programming
 
Introducing scala
Introducing scalaIntroducing scala
Introducing scala
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in Rust
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Jscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptJscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScript
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)
 
Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
 
深入浅出Jscex
深入浅出Jscex深入浅出Jscex
深入浅出Jscex
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scala
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
 
Coffee Scriptでenchant.js
Coffee Scriptでenchant.jsCoffee Scriptでenchant.js
Coffee Scriptでenchant.js
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming ii
 
03. haskell refresher quiz
03. haskell refresher quiz03. haskell refresher quiz
03. haskell refresher quiz
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
Strinng Classes in c++
Strinng Classes in c++Strinng Classes in c++
Strinng Classes in c++
 
Principles of functional progrmming in scala
Principles of functional progrmming in scalaPrinciples of functional progrmming in scala
Principles of functional progrmming in scala
 
Taylor problem
Taylor problemTaylor problem
Taylor problem
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class Functions
 
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐาน
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐานภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐาน
ภาษา C โปรแกรมย่อยและฟังก์ชันมาตรฐาน
 

Último

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 

Último (20)

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 

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