SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
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?

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
 

Kürzlich hochgeladen

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 

Kürzlich hochgeladen (20)

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 

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