SlideShare une entreprise Scribd logo
1  sur  75
Télécharger pour lire hors ligne
Grammarware Memes
   Eelco Visser & Guido Wachsmuth
Background
Spoofax Language Workbench
WebDSL Web Programming Language

  define page post(p: Post, title: String) {
    init{ p.update(); }
    title{ output(p.title) }
    bloglayout(p.blog){
      placeholder view { postView(p) }
      postComments(p)
    }
  }

  define ajax postView(p: Post) {
    pageHeader2{ output(p.title) }
    postBodyLayout(p) {
  	   postContent(p)
  	   postExtendedContent(p)
  	   postActions(p)
  	 }
  }
Researchr Bibliography Management System
WebLab Programming Education on the Web
Some Philosophical Considerations
Grammarware vs Modelware?




 GPCE                   MODELS
OOPSLA                   ICMT
Grammarware vs Modelware?




 GPCE                   MODELS
              SLE
OOPSLA                   ICMT
Functional vs Object-Oriented vs
            Logic vs ...
Remember the Programming Language Wars?




    ICFP                     OOPSLA
Remember the Programming Language Wars?




    ICFP         GPCE        OOPSLA
Scala: Object-Oriented or
        Functional?



‘closure’: a purely functional feature?
X-ware is a Memeplex



memeplex: selection of memes from the meme pool
What is Grammarware?
Grammarware is about
  (Parsing) Text

               module users

               imports library

               entity User {
                 email    : String
                 password : String
                 isAdmin : Bool
               }
Grammarware is about
                           Structure
Module(
  "users"
, [ Imports("library")
  , Entity(
      "User"
    , [ Property("email", Type("String"))
      , Property("password", Type("String"))
      , Property("isAdmin", Type("Bool"))
      ]
    )
  ]
)
Grammarware: Text & Structure
Grammarware is about Transformation
Source to Source Transformation
Source to Source Transformation
Transformation & Analysis


  name resolution

    type checking

      desugaring

  code generation
Some Memes from
the Spoofax Memeplex
EnFun: Entities with Functions
 module blog
   entity String {
     function plus(that:String): String
   }
   entity Bool { }
   entity Set<T> {
     function add(x: T)
     function remove(x: T)
     function member(x: T): Bool
   }
   entity Blog {
     posts : Set<Post>
     function newPost(): Post {
       var p : Post := Post.new();
       posts.add(p);
     }
   }
   entity Post {
     title : String
   }
Structure
Signature & Terms


constructors
  Module : ID * List(Definition) -> Module
  Imports : ID -> Definition




         Module(
           "application"
         , [Imports("library"),
            Imports("users"),
            Imports("frontend")]
         )
Entities & Properties

constructors
  Entity : ID * List(Property) -> Definition
  Type   : ID -> Type
  New    : Type -> Exp

constructors
  Property     : ID * Type -> Property
  This         : Exp
  PropAccess   : Exp * ID -> Exp



Module("users"
, [ Imports("library")
  , Entity("User"
    , [ Property("email",    Type("String"))
      , Property("password", Type("String"))
      , Property("isAdmin", Type("Bool"))])])
Constants & Operators & Variables
constructors                           constructors
  String : STRING -> Exp                 Geq    : Exp     * Exp ->   Exp
  Int    : INT -> Exp                    Leq    : Exp     * Exp ->   Exp
  False : Exp                            Gt     : Exp     * Exp ->   Exp
  True   : Exp                           Lt     : Exp     * Exp ->   Exp
                                         Eq     : Exp     * Exp ->   Exp
                                         Mul    : Exp     * Exp ->   Exp
                                         Minus : Exp      * Exp ->   Exp
                                         Plus   : Exp     * Exp ->   Exp
                                         Or     : Exp     * Exp ->   Exp
                                         And    : Exp     * Exp ->   Exp
                                         Not    : Exp     -> Exp


                           constructors
                             VarDecl       :   ID * Type -> Stat
                             VarDeclInit   :   ID * Type * Exp -> Stat
                             Assign        :   Exp * Exp -> Stat
                             Var           :   ID -> Exp
Statements & Functions

constructors
  Exp    : Exp -> Stat
  Block : List(Stat) -> Stat
  Seq    : List(Stat) -> Stat
  While : Exp * List(Stat) -> Stat
  IfElse : Exp * List(Stat) * List(ElseIf) * Option(Else) -> Stat
  Else   : List(Stat) -> Else
  ElseIf : Exp * List(Stat) -> ElseIf


constructors
  FunDef   :   ID * List(Arg) * Type * List(Stat) -> Property
  FunDecl :    ID * List(Arg) * Type -> Property
  Arg      :   ID * Type -> Arg
  Return   :   Exp -> Stat
  MethCall :   Exp * ID * List(Exp) -> Exp
  ThisCall :   ID * List(Exp) -> Exp
Transformation
Transformation by Strategic Rewriting

 rules

   desugar:
     Plus(e1, e2) -> MethCall(e1, "plus", [e2])

   desugar:
     Or(e1, e2) -> MethCall(e1, "or", [e2])

   desugar :
     VarDeclInit(x, t, e) ->
     Seq([VarDecl(x, t),
          Assign(Var(x), e)])

 strategies

   desugar-all = topdown(repeat(desugar))
Return-Lifting Applied



function fact(n: Int): Int {       function fact(n: Int): Int {
                                     var res: Int;
    if(n == 0) {                     if(n == 0) {
      return 1;                        res := 1;
    } else {                         } else {
      return this * fact(n - 1);       res := this * fact(n - 1);
    }                                }
                                     return res;
}                                  }
Return-Lifting Rules

rules

  lift-return-all =
    alltd(lift-return; normalize-all)

  lift-return :
    FunDef(x, arg*, Some(t), stat1*) ->
    FunDef(x, arg*, Some(t), Seq([
      VarDecl(y, t),
      Seq(stat2*),
      Return(Var(y))
    ]))
    where y := <new>;
          stat2* := <alltd(replace-return(|y))> stat1*

  replace-return(|y) :
    Return(e) -> Assign(y, e)
Seq Normalization

strategies

  normalize-all = innermost-L(normalize)

rules // seq lifting

  normalize :
    [Seq(stat1*) | stat2*@[_|_]] -> [Seq([stat1*,stat2*])]

  normalize :
    [stat, Seq(stat*)] -> [Seq([stat | stat*])]

  normalize :
    Block([Seq(stat1*)]) -> Block(stat1*)

  normalize :
    FunDef(x, arg*, t, [Seq(stat*)]) -> FunDef(x, arg*, t, stat*)
Interpretation



     eval
Small Step Operational Semantics



rules // driver

    steps = repeat(step)
	
    step:
      State([Frame(fn, this, slots, cont)|f*], heap) ->
      State(stack', heap')
    where
      cont' := <eval> cont;
      stack' := <update-stack (|...)> [Frame(..., cont')|f*];
      heap' := <update-heap(|...)> heap
Small Step Operational Semantics



eval(|this, slots, heap):
	 Var(x) -> val
	 where val := <lookup> (x, slots)
	
eval(|this, slots, heap):
	 PropAccess(Ptr(p), prop) -> val
	 where
	 	 Object(_, props) 	:= <lookup> (p, heap);
	 	 val	 	 	 	 	 	 := <lookup> (prop, props)
From Text to Structure
Declarative Syntax Definition




                              Entity("User", [
                                 Property("first", Type("String")),
                                 Property("last", Type("String"))
                              ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax Definition




entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax Definition

context-free syntax
  "entity" ID "{" Property* "}" -> Definition {"Entity"}
  ID                            -> Type       {"Type"}
  ID ":" Type                   -> Property   {"Property"}



entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Declarative Syntax Definition

context-free syntax
  "entity" ID "{" Property* "}" -> Definition {"Entity"}
  ID                            -> Type       {"Type"}
  ID ":" Type                   -> Property   {"Property"}



entity User {                 Entity("User", [
  first : String                 Property("first", Type("String")),
  last   : String                Property("last", Type("String"))
}                             ])



signature
  constructors
    Entity   : ID * List(Property) -> Definition
    Type     : ID                  -> Type
    Property : ID * Type           -> Property
Context-free Syntax
context-free syntax                 constructors
  "true"       -> Exp   {"True"}      True   : Exp
  "false"      -> Exp   {"False"}     False : Exp
  "!" Exp      -> Exp   {"Not"}       Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}       And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}        Or     : Exp * Exp -> Exp
Lexical Syntax
context-free syntax                 constructors
  "true"       -> Exp   {"True"}      True   : Exp
  "false"      -> Exp   {"False"}     False : Exp
  "!" Exp      -> Exp   {"Not"}       Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}       And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}        Or     : Exp * Exp -> Exp


lexical syntax                      constructors
  [a-zA-Z][a-zA-Z0-9]* -> ID         : String -> ID
  "-"? [0-9]+          -> INT        : String -> INT
  [ tnr]           -> LAYOUT




           scannerless generalized (LR) parsing
Ambiguity
context-free syntax                        constructors
  "true"       -> Exp   {"True"}             True   : Exp
  "false"      -> Exp   {"False"}            False : Exp
  "!" Exp      -> Exp   {"Not"}              Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}              And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}               Or     : Exp * Exp -> Exp



          isPublic || isDraft && (author == principal())




amb([
   And(Or(Var("isPublic"), Var("isDraft")),
       Eq(Var("author"), ThisCall("principal", []))),
   Or(Var("isPublic"),
      And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", []))))
])
Disambiguation by Encoding Precedence
context-free syntax                      constructors
  "true"       -> Exp   {"True"}           True   : Exp
  "false"      -> Exp   {"False"}          False : Exp
  "!" Exp      -> Exp   {"Not"}            Not    : Exp -> Exp
  Exp "&&" Exp -> Exp   {"And"}            And    : Exp * Exp -> Exp
  Exp "||" Exp -> Exp   {"Or"}             Or     : Exp * Exp -> Exp




context-free syntax
  "(" Exp ")"    ->   Exp0   {bracket}
  "true"         ->   Exp0   {"True"}
  "false"        ->   Exp0   {"False"}
  Exp0           ->   Exp1
  "!" Exp0       ->   Exp1   {"Not"}
  Exp1           ->   Exp2
  Exp1 "&&" Exp2 ->   Exp2   {"And"}
  Exp2           ->   Exp3
  Exp2 "||" Exp3 ->   Exp3   {"Or"}
Declarative Disambiguation
context-free syntax
  "true"       -> Exp {"True"}
  "false"      -> Exp {"False"}
  "!" Exp      -> Exp {"Not"}
  Exp "&&" Exp -> Exp {"And", left}
  Exp "||" Exp -> Exp {"Or", left}
  "(" Exp ")" -> Exp {bracket}
context-free priorities
  {left: Exp.Not} >
  {left: Exp.Mul} >
  {left: Exp.Plus Exp.Minus} >
  {left: Exp.And} >
  {non-assoc: Exp.Eq Exp.Lt Exp.Gt Exp.Leq Exp.Geq}


isPublic || isDraft && (author == principal())


             Or(Var("isPublic"),
                And(Var("isDraft"),
                    Eq(Var("author"), ThisCall("principal", []))))
Generating Text from Structure
Code Generation by String Concatenation



 to-java:
   Property(x, Type(t)) -> <concat-strings>[
     "private ", t, " ", x, ";nn",
     "public ", t, " get_", x, " {n",
     "    return ", x, ";n",
     "}n",
     "public void set_", x, " (", t, " ", x, ") {n",
     "    this.", x, " = ", x, ";n",
     "}"
   ]
String Interpolation Templates


  to-java:
    Property(x, Type(t)) -> $[
      private [t] [x];

        public [t] get_[x] {
          return [x];
        }

        public void set_[x] ([t] [x]) {
          this.[x] = [x];
        }
    ]
Code Generation by
Model Transformation
Generating Structured Representations


to-java:
  Property(x, Type(t)) -> [
    Field([Private()], Type(t), Var(x)),

      Method([Public()], Type(t), $[get_[x]], [], [
        Return(Var(x))
      ]),

      Method([Public()], None(), $[set_[x]], [Param(Type(t), x)], [
         Assign(FieldAccess(This(), x), Var(x))
      ])
  ]
Concrete Object Syntax


 to-java:
   Property(x, Type(t)) -> |[
    private t x;

        public t get_#x {
            return x;
        }

        public void set_#x (t x) {
            this.x = x;
        }
   ]|
Rewriting with Concrete Object Syntax

  module desugar

  imports Enfun

  strategies

    desugar-all = topdown(repeat(desugar))

  rules
    desugar: |[ !e       ]| -> |[ e.not() ]|
    desugar: |[ e1 && e2 ]| -> |[ e1.and(e2) ]|
    desugar: |[ e1 || e2 ]| -> |[ e1.or(e2) ]|

    desugar: |[ e1 +   e2 ]| -> |[ e1.plus(e2) ]|
    desugar: |[ e1 *   e2 ]| -> |[ e1.times(e2) ]|
    desugar: |[ e1 -   e2 ]| -> |[ e1.minus(e2) ]|
Rewriting with Concrete Object Syntax

lift-return-cs :
  |[ function x(arg*) : t { stat1* } ]| ->
  |[ function x(arg*): t {
       var y : t;
       ( stat2* )
       return y;
     } ]|
  where y := <new>;
        stat2* := <alltd(replace-return(|y))> stat1*




         lift-return :
           FunDef(x, arg*, Some(t), stat1*) ->
           FunDef(x, arg*, Some(t), Seq([
             VarDecl(y, t),
             Seq(stat2*),
             Return(Var(y))
           ]))
           where y := <new>;
                 stat2* := <alltd(replace-return(|y))> stat1*
Pretty-Printing by
Model Transformation
Code Formatting
module users
  entity String { }
  entity User { first : String last : String }




       Module(
         "demo1"
                                                   module users
       , [ Entity("String", None(), None(), [])
         , Entity(                                 entity String   {
             "User"
                                                   }
           , [ Property("first", Type("String"))
             , Property("last", Type("String"))
             ]                                     entity User {
           )                                         first : String
         ]
       )
                                                     last : String
                                                   }
Pretty-Printer Specification


prettyprint-Definition :
  Entity(x, prop*) ->
    [ H([SOpt(HS(), "0")]
       , [ S("entity ")
         , <pp-one-Z(prettyprint-ID)> x
         , S(" {")
         ]
       )
     , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*]
     , H([SOpt(HS(), "0")], [S("}")]
       )
     ]
Structure Editors
Discoverability
Editors with Syntactic Completion
Completion Templates



completions

  completion template Definition : "entity ID { }" =
    "entity " <ID:ID> " {nt" (cursor) "n}" (blank)

  completion template Type : "ID" =
    <ID:ID>

  completion template Property : "ID : ID " =
    <ID:ID> " : " <ID:Type> (blank)
Syntax Templates: Structure + Layout
                                    context-free syntax
                                      "entity" ID "{" Property* "}" -> Definition {"Entity"}
                                      ID                            -> Type       {"Type"}
                                      ID ":" Type                   -> Property   {"Property"}



templates
                                    signature
                                      constructors
                                        Entity   : ID * List(Property) -> Definition
  Definition.Entity = <                 Type     : ID                  -> Type
                                        Property : ID * Type           -> Property
    entity <ID> {
      <Property*; separator="n">
                                    completions
    }                                 completion template Definition : "entity ID { }" =

  >                                     "entity " <ID:ID> " {nt" (cursor) "n}" (blank)

                                      completion template Type : "ID<>" =
                                        <ID:ID> "<" <:Type> ">"

  Type.Type = <<ID>>                  completion template Property : "ID : ID " =
                                        <ID:ID> " : " <ID:Type> (blank)




  Property.Property = <
                                    prettyprint-Definition =
    <ID> : <Type>                     ?Entity(x, prop*)
                                      ; ![ H(

  >                                           [SOpt(HS(), "0")]
                                           , [ S("entity ")
                                              , <pp-one-Z(prettyprint-ID)> x
                                              , S(" {")
                                              ]
                                           )
                                         , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*]
                                         , H([SOpt(HS(), "0")], [S("}")]
                                           )
                                         ]
Type Checking
Example: Checking Method Calls

module renaming

  entity String {
    function plus(that:String): String { ... }
  }

  entity User {
    firstName : String
    lastName : String
    fullName : String
    function rename(first: String, last: String) {
      fullName := first.plus(0);          // argument has wrong type
      fullName := first.plus();           // too few arguments
      fullName := first.plus(last, last); // too many arguments
      fullName := first.plus(last);       // correct
    }
  }
Constraint Checks

rules // errors

  type-error :
    (e, t) -> (e, $[Type [<pp>t] expected instead of [<pp>t']])
    where <type-of> e => t'; not(<subtype>(t', t))

rules // functions

  constraint-error:
    |[ e.x(e*) ]| -> (x, $[Expects [m] arguments, found [n]])
    where <lookup-type> x => (t*, t);
          <length> e* => n; <length> t* => m;
          not(<eq>(m, n))

  constraint-error:
    |[ e.x(e*) ]| -> <zip; filter(type-error)> (e*, t*)
    where <lookup-type> x => (t*, t)
Type Analysis




rules // constants

  type-of   :   |[ true ]|    ->   TypeBool()
  type-of   :   |[ false ]|   ->   TypeBool()
  type-of   :   Int(i)        ->   TypeInt()
  type-of   :   String(x)     ->   TypeString()
Types of Names

rules // names

  type-of :
    Var(x) -> <lookup-type> x

  type-of :
    |[ e.x ]| -> t
    where <lookup-type> x => t

  type-of :
    |[ e.x(e*) ]| -> t
    where <lookup-type> x => (t*, t)

  type-of :
    |[ f(e*) ]| -> t
    where <lookup-type> f => (t*, t)
Analysis: Name Resolution




                   +
Definitions and References

                                  definition

  test type refers to entity [[
    module test
    entity [[String]] { }
    entity User {
      first : [[String]]
      last : String
    }
  ]] resolve #2 to #1
                                  reference
From Tree to Graph



Module(
  "test"
, [ Entity("String", [])
  , Entity(
      "User"
    , [ Property("first",   )
      , Property("last",    )
      ]
    )
  ]
)
Unique Names


Module(
  "users"{[Module(), "users"]}
  , [ Entity("String"{[Type(), "String", "users"]}, [])
    , Entity(
        "User"{[Type(), "User", "users"]}
      , [ Property(
            "first"{[Property(), "first", "User", "users"]}
          , Type("String"{[Type(), "String", "users"]}))
        , Property(
            "last"{[Property(), "last", "User", "users"]}
          , Type("String"{[Type(), "String", "users"]}))
        ]
      )
    ]
  )




      + index mapping unique names to values
Spoofax Name Binding Language
      namespaces Module Type             See the full story in
                                          SLE talk on Friday
      rules

        Entity(c, _) :
          defines Type c
              	 	 	
        Type(x, _) :
          refers to Type x
      	 	
        Module(m, _) :
          defines Module m
          scopes Type
      	 	
        Imports(m) :
          imports Type from Module m



  abstract from name resolution algorithmics
spoofax.org




http://spoofax.org

Contenu connexe

Tendances

Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlinintelliyole
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real Worldosfameron
 
Model-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error CheckingModel-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error CheckingEelco Visser
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from javaIndicThreads
 
Swift와 Objective-C를 함께 쓰는 방법
Swift와 Objective-C를 함께 쓰는 방법Swift와 Objective-C를 함께 쓰는 방법
Swift와 Objective-C를 함께 쓰는 방법Jung Kim
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecLoïc Descotte
 
Pig Introduction to Pig
Pig Introduction to PigPig Introduction to Pig
Pig Introduction to PigChris Wilkes
 
From android/java to swift (3)
From android/java to swift (3)From android/java to swift (3)
From android/java to swift (3)allanh0526
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Jonas Bonér
 
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
 

Tendances (20)

Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 
Java string handling
Java string handlingJava string handling
Java string handling
 
Model-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error CheckingModel-Driven Software Development - Static Analysis & Error Checking
Model-Driven Software Development - Static Analysis & Error Checking
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from java
 
Swift와 Objective-C를 함께 쓰는 방법
Swift와 Objective-C를 함께 쓰는 방법Swift와 Objective-C를 함께 쓰는 방법
Swift와 Objective-C를 함께 쓰는 방법
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
OO in JavaScript
OO in JavaScriptOO in JavaScript
OO in JavaScript
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
Pig Introduction to Pig
Pig Introduction to PigPig Introduction to Pig
Pig Introduction to Pig
 
Java script arrays
Java script arraysJava script arrays
Java script arrays
 
Scala - brief intro
Scala - brief introScala - brief intro
Scala - brief intro
 
From android/java to swift (3)
From android/java to swift (3)From android/java to swift (3)
From android/java to swift (3)
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
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 jargon cheatsheet
Scala jargon cheatsheetScala jargon cheatsheet
Scala jargon cheatsheet
 

Similaire à Grammarware Memes

Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in goYusuke Kita
 
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Eelco Visser
 
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022InfluxData
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1saydin_soft
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming iiPrashant Kalkar
 
Building DSLs With Eclipse
Building DSLs With EclipseBuilding DSLs With Eclipse
Building DSLs With EclipsePeter Friese
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with PythonHan Lee
 
JavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React NativeJavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React NativeMitchell Tilbrook
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scalaparag978978
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
Improving Correctness with Types Kats Conf
Improving Correctness with Types Kats ConfImproving Correctness with Types Kats Conf
Improving Correctness with Types Kats ConfIain Hull
 

Similaire à Grammarware Memes (20)

Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
 
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
Scott Anderson [InfluxData] | New & Upcoming Flux Features | InfluxDays 2022
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
Meet scala
Meet scalaMeet scala
Meet scala
 
360|iDev
360|iDev360|iDev
360|iDev
 
Working With JQuery Part1
Working With JQuery Part1Working With JQuery Part1
Working With JQuery Part1
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming ii
 
Building DSLs With Eclipse
Building DSLs With EclipseBuilding DSLs With Eclipse
Building DSLs With Eclipse
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with Python
 
JavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React NativeJavaScript, TypeScipt and React Native
JavaScript, TypeScipt and React Native
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Introducing scala
Introducing scalaIntroducing scala
Introducing scala
 
Improving Correctness with Types Kats Conf
Improving Correctness with Types Kats ConfImproving Correctness with Types Kats Conf
Improving Correctness with Types Kats Conf
 

Plus de Eelco Visser

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingCS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingEelco Visser
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesEelco Visser
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingEelco Visser
 
CS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionCS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionEelco Visser
 
CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionEelco Visser
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesEelco Visser
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with StatixEelco Visser
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionEelco Visser
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Eelco Visser
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementEelco Visser
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersEelco Visser
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationEelco Visser
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesEelco Visser
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksEelco Visser
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisEelco Visser
 
Compiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionCompiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionEelco Visser
 
Compiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsCompiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsEelco Visser
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingEelco Visser
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisEelco Visser
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingEelco Visser
 

Plus de Eelco Visser (20)

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingCS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic Services
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | Parsing
 
CS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionCS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definition
 
CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: Introduction
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation Rules
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler Construction
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory Management
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | Interpreters
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code Generation
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual Machines
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone Frameworks
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow Analysis
 
Compiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionCompiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint Resolution
 
Compiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsCompiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type Constraints
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static Analysis
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
 

Dernier

A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 

Dernier (20)

A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 

Grammarware Memes

  • 1. Grammarware Memes Eelco Visser & Guido Wachsmuth
  • 4. WebDSL Web Programming Language define page post(p: Post, title: String) { init{ p.update(); } title{ output(p.title) } bloglayout(p.blog){ placeholder view { postView(p) } postComments(p) } } define ajax postView(p: Post) { pageHeader2{ output(p.title) } postBodyLayout(p) { postContent(p) postExtendedContent(p) postActions(p) } }
  • 8. Grammarware vs Modelware? GPCE MODELS OOPSLA ICMT
  • 9. Grammarware vs Modelware? GPCE MODELS SLE OOPSLA ICMT
  • 10. Functional vs Object-Oriented vs Logic vs ...
  • 11. Remember the Programming Language Wars? ICFP OOPSLA
  • 12. Remember the Programming Language Wars? ICFP GPCE OOPSLA
  • 13. Scala: Object-Oriented or Functional? ‘closure’: a purely functional feature?
  • 14. X-ware is a Memeplex memeplex: selection of memes from the meme pool
  • 16. Grammarware is about (Parsing) Text module users imports library entity User { email : String password : String isAdmin : Bool }
  • 17.
  • 18. Grammarware is about Structure Module( "users" , [ Imports("library") , Entity( "User" , [ Property("email", Type("String")) , Property("password", Type("String")) , Property("isAdmin", Type("Bool")) ] ) ] )
  • 19. Grammarware: Text & Structure
  • 20. Grammarware is about Transformation
  • 21. Source to Source Transformation
  • 22. Source to Source Transformation
  • 23. Transformation & Analysis name resolution type checking desugaring code generation
  • 24. Some Memes from the Spoofax Memeplex
  • 25. EnFun: Entities with Functions module blog entity String { function plus(that:String): String } entity Bool { } entity Set<T> { function add(x: T) function remove(x: T) function member(x: T): Bool } entity Blog { posts : Set<Post> function newPost(): Post { var p : Post := Post.new(); posts.add(p); } } entity Post { title : String }
  • 27. Signature & Terms constructors Module : ID * List(Definition) -> Module Imports : ID -> Definition Module( "application" , [Imports("library"), Imports("users"), Imports("frontend")] )
  • 28. Entities & Properties constructors Entity : ID * List(Property) -> Definition Type : ID -> Type New : Type -> Exp constructors Property : ID * Type -> Property This : Exp PropAccess : Exp * ID -> Exp Module("users" , [ Imports("library") , Entity("User" , [ Property("email", Type("String")) , Property("password", Type("String")) , Property("isAdmin", Type("Bool"))])])
  • 29. Constants & Operators & Variables constructors constructors String : STRING -> Exp Geq : Exp * Exp -> Exp Int : INT -> Exp Leq : Exp * Exp -> Exp False : Exp Gt : Exp * Exp -> Exp True : Exp Lt : Exp * Exp -> Exp Eq : Exp * Exp -> Exp Mul : Exp * Exp -> Exp Minus : Exp * Exp -> Exp Plus : Exp * Exp -> Exp Or : Exp * Exp -> Exp And : Exp * Exp -> Exp Not : Exp -> Exp constructors VarDecl : ID * Type -> Stat VarDeclInit : ID * Type * Exp -> Stat Assign : Exp * Exp -> Stat Var : ID -> Exp
  • 30. Statements & Functions constructors Exp : Exp -> Stat Block : List(Stat) -> Stat Seq : List(Stat) -> Stat While : Exp * List(Stat) -> Stat IfElse : Exp * List(Stat) * List(ElseIf) * Option(Else) -> Stat Else : List(Stat) -> Else ElseIf : Exp * List(Stat) -> ElseIf constructors FunDef : ID * List(Arg) * Type * List(Stat) -> Property FunDecl : ID * List(Arg) * Type -> Property Arg : ID * Type -> Arg Return : Exp -> Stat MethCall : Exp * ID * List(Exp) -> Exp ThisCall : ID * List(Exp) -> Exp
  • 32. Transformation by Strategic Rewriting rules desugar: Plus(e1, e2) -> MethCall(e1, "plus", [e2]) desugar: Or(e1, e2) -> MethCall(e1, "or", [e2]) desugar : VarDeclInit(x, t, e) -> Seq([VarDecl(x, t), Assign(Var(x), e)]) strategies desugar-all = topdown(repeat(desugar))
  • 33. Return-Lifting Applied function fact(n: Int): Int { function fact(n: Int): Int { var res: Int; if(n == 0) { if(n == 0) { return 1; res := 1; } else { } else { return this * fact(n - 1); res := this * fact(n - 1); } } return res; } }
  • 34. Return-Lifting Rules rules lift-return-all = alltd(lift-return; normalize-all) lift-return : FunDef(x, arg*, Some(t), stat1*) -> FunDef(x, arg*, Some(t), Seq([ VarDecl(y, t), Seq(stat2*), Return(Var(y)) ])) where y := <new>; stat2* := <alltd(replace-return(|y))> stat1* replace-return(|y) : Return(e) -> Assign(y, e)
  • 35. Seq Normalization strategies normalize-all = innermost-L(normalize) rules // seq lifting normalize : [Seq(stat1*) | stat2*@[_|_]] -> [Seq([stat1*,stat2*])] normalize : [stat, Seq(stat*)] -> [Seq([stat | stat*])] normalize : Block([Seq(stat1*)]) -> Block(stat1*) normalize : FunDef(x, arg*, t, [Seq(stat*)]) -> FunDef(x, arg*, t, stat*)
  • 37. Small Step Operational Semantics rules // driver steps = repeat(step) step: State([Frame(fn, this, slots, cont)|f*], heap) -> State(stack', heap') where cont' := <eval> cont; stack' := <update-stack (|...)> [Frame(..., cont')|f*]; heap' := <update-heap(|...)> heap
  • 38. Small Step Operational Semantics eval(|this, slots, heap): Var(x) -> val where val := <lookup> (x, slots) eval(|this, slots, heap): PropAccess(Ptr(p), prop) -> val where Object(_, props) := <lookup> (p, heap); val := <lookup> (prop, props)
  • 39. From Text to Structure
  • 40. Declarative Syntax Definition Entity("User", [ Property("first", Type("String")), Property("last", Type("String")) ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 41. Declarative Syntax Definition entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 42. Declarative Syntax Definition context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 43. Declarative Syntax Definition context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} entity User { Entity("User", [ first : String Property("first", Type("String")), last : String Property("last", Type("String")) } ]) signature constructors Entity : ID * List(Property) -> Definition Type : ID -> Type Property : ID * Type -> Property
  • 44. Context-free Syntax context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp
  • 45. Lexical Syntax context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp lexical syntax constructors [a-zA-Z][a-zA-Z0-9]* -> ID : String -> ID "-"? [0-9]+ -> INT : String -> INT [ tnr] -> LAYOUT scannerless generalized (LR) parsing
  • 46. Ambiguity context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp isPublic || isDraft && (author == principal()) amb([ And(Or(Var("isPublic"), Var("isDraft")), Eq(Var("author"), ThisCall("principal", []))), Or(Var("isPublic"), And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", [])))) ])
  • 47. Disambiguation by Encoding Precedence context-free syntax constructors "true" -> Exp {"True"} True : Exp "false" -> Exp {"False"} False : Exp "!" Exp -> Exp {"Not"} Not : Exp -> Exp Exp "&&" Exp -> Exp {"And"} And : Exp * Exp -> Exp Exp "||" Exp -> Exp {"Or"} Or : Exp * Exp -> Exp context-free syntax "(" Exp ")" -> Exp0 {bracket} "true" -> Exp0 {"True"} "false" -> Exp0 {"False"} Exp0 -> Exp1 "!" Exp0 -> Exp1 {"Not"} Exp1 -> Exp2 Exp1 "&&" Exp2 -> Exp2 {"And"} Exp2 -> Exp3 Exp2 "||" Exp3 -> Exp3 {"Or"}
  • 48. Declarative Disambiguation context-free syntax "true" -> Exp {"True"} "false" -> Exp {"False"} "!" Exp -> Exp {"Not"} Exp "&&" Exp -> Exp {"And", left} Exp "||" Exp -> Exp {"Or", left} "(" Exp ")" -> Exp {bracket} context-free priorities {left: Exp.Not} > {left: Exp.Mul} > {left: Exp.Plus Exp.Minus} > {left: Exp.And} > {non-assoc: Exp.Eq Exp.Lt Exp.Gt Exp.Leq Exp.Geq} isPublic || isDraft && (author == principal()) Or(Var("isPublic"), And(Var("isDraft"), Eq(Var("author"), ThisCall("principal", []))))
  • 49. Generating Text from Structure
  • 50. Code Generation by String Concatenation to-java: Property(x, Type(t)) -> <concat-strings>[ "private ", t, " ", x, ";nn", "public ", t, " get_", x, " {n", " return ", x, ";n", "}n", "public void set_", x, " (", t, " ", x, ") {n", " this.", x, " = ", x, ";n", "}" ]
  • 51. String Interpolation Templates to-java: Property(x, Type(t)) -> $[ private [t] [x]; public [t] get_[x] { return [x]; } public void set_[x] ([t] [x]) { this.[x] = [x]; } ]
  • 52. Code Generation by Model Transformation
  • 53. Generating Structured Representations to-java: Property(x, Type(t)) -> [ Field([Private()], Type(t), Var(x)), Method([Public()], Type(t), $[get_[x]], [], [ Return(Var(x)) ]), Method([Public()], None(), $[set_[x]], [Param(Type(t), x)], [ Assign(FieldAccess(This(), x), Var(x)) ]) ]
  • 54. Concrete Object Syntax to-java: Property(x, Type(t)) -> |[ private t x; public t get_#x { return x; } public void set_#x (t x) { this.x = x; } ]|
  • 55. Rewriting with Concrete Object Syntax module desugar imports Enfun strategies desugar-all = topdown(repeat(desugar)) rules desugar: |[ !e ]| -> |[ e.not() ]| desugar: |[ e1 && e2 ]| -> |[ e1.and(e2) ]| desugar: |[ e1 || e2 ]| -> |[ e1.or(e2) ]| desugar: |[ e1 + e2 ]| -> |[ e1.plus(e2) ]| desugar: |[ e1 * e2 ]| -> |[ e1.times(e2) ]| desugar: |[ e1 - e2 ]| -> |[ e1.minus(e2) ]|
  • 56. Rewriting with Concrete Object Syntax lift-return-cs : |[ function x(arg*) : t { stat1* } ]| -> |[ function x(arg*): t { var y : t; ( stat2* ) return y; } ]| where y := <new>; stat2* := <alltd(replace-return(|y))> stat1* lift-return : FunDef(x, arg*, Some(t), stat1*) -> FunDef(x, arg*, Some(t), Seq([ VarDecl(y, t), Seq(stat2*), Return(Var(y)) ])) where y := <new>; stat2* := <alltd(replace-return(|y))> stat1*
  • 58. Code Formatting module users entity String { } entity User { first : String last : String } Module( "demo1" module users , [ Entity("String", None(), None(), []) , Entity( entity String { "User" } , [ Property("first", Type("String")) , Property("last", Type("String")) ] entity User { ) first : String ] ) last : String }
  • 59. Pretty-Printer Specification prettyprint-Definition : Entity(x, prop*) -> [ H([SOpt(HS(), "0")] , [ S("entity ") , <pp-one-Z(prettyprint-ID)> x , S(" {") ] ) , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*] , H([SOpt(HS(), "0")], [S("}")] ) ]
  • 63. Completion Templates completions completion template Definition : "entity ID { }" = "entity " <ID:ID> " {nt" (cursor) "n}" (blank) completion template Type : "ID" = <ID:ID> completion template Property : "ID : ID " = <ID:ID> " : " <ID:Type> (blank)
  • 64. Syntax Templates: Structure + Layout context-free syntax "entity" ID "{" Property* "}" -> Definition {"Entity"} ID -> Type {"Type"} ID ":" Type -> Property {"Property"} templates signature constructors Entity : ID * List(Property) -> Definition Definition.Entity = < Type : ID -> Type Property : ID * Type -> Property entity <ID> { <Property*; separator="n"> completions } completion template Definition : "entity ID { }" = > "entity " <ID:ID> " {nt" (cursor) "n}" (blank) completion template Type : "ID<>" = <ID:ID> "<" <:Type> ">" Type.Type = <<ID>> completion template Property : "ID : ID " = <ID:ID> " : " <ID:Type> (blank) Property.Property = < prettyprint-Definition = <ID> : <Type> ?Entity(x, prop*) ; ![ H( > [SOpt(HS(), "0")] , [ S("entity ") , <pp-one-Z(prettyprint-ID)> x , S(" {") ] ) , <pp-indent(|"2")> [<pp-V-list(prettyprint-Property)> p*] , H([SOpt(HS(), "0")], [S("}")] ) ]
  • 66. Example: Checking Method Calls module renaming entity String { function plus(that:String): String { ... } } entity User { firstName : String lastName : String fullName : String function rename(first: String, last: String) { fullName := first.plus(0); // argument has wrong type fullName := first.plus(); // too few arguments fullName := first.plus(last, last); // too many arguments fullName := first.plus(last); // correct } }
  • 67. Constraint Checks rules // errors type-error : (e, t) -> (e, $[Type [<pp>t] expected instead of [<pp>t']]) where <type-of> e => t'; not(<subtype>(t', t)) rules // functions constraint-error: |[ e.x(e*) ]| -> (x, $[Expects [m] arguments, found [n]]) where <lookup-type> x => (t*, t); <length> e* => n; <length> t* => m; not(<eq>(m, n)) constraint-error: |[ e.x(e*) ]| -> <zip; filter(type-error)> (e*, t*) where <lookup-type> x => (t*, t)
  • 68. Type Analysis rules // constants type-of : |[ true ]| -> TypeBool() type-of : |[ false ]| -> TypeBool() type-of : Int(i) -> TypeInt() type-of : String(x) -> TypeString()
  • 69. Types of Names rules // names type-of : Var(x) -> <lookup-type> x type-of : |[ e.x ]| -> t where <lookup-type> x => t type-of : |[ e.x(e*) ]| -> t where <lookup-type> x => (t*, t) type-of : |[ f(e*) ]| -> t where <lookup-type> f => (t*, t)
  • 71. Definitions and References definition test type refers to entity [[ module test entity [[String]] { } entity User { first : [[String]] last : String } ]] resolve #2 to #1 reference
  • 72. From Tree to Graph Module( "test" , [ Entity("String", []) , Entity( "User" , [ Property("first", ) , Property("last", ) ] ) ] )
  • 73. Unique Names Module( "users"{[Module(), "users"]} , [ Entity("String"{[Type(), "String", "users"]}, []) , Entity( "User"{[Type(), "User", "users"]} , [ Property( "first"{[Property(), "first", "User", "users"]} , Type("String"{[Type(), "String", "users"]})) , Property( "last"{[Property(), "last", "User", "users"]} , Type("String"{[Type(), "String", "users"]})) ] ) ] ) + index mapping unique names to values
  • 74. Spoofax Name Binding Language namespaces Module Type See the full story in SLE talk on Friday rules Entity(c, _) : defines Type c Type(x, _) : refers to Type x Module(m, _) : defines Module m scopes Type Imports(m) : imports Type from Module m abstract from name resolution algorithmics