SlideShare a Scribd company logo
1 of 75
Download to read offline
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

More Related Content

What's hot

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
 

What's hot (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
 

Similar to 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
 

Similar to 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
 

More from 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
 

More from 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
 

Recently uploaded

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 

Recently uploaded (20)

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 

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