SlideShare a Scribd company logo
http://www.mobl-lang.org


Zef Hemel
230,000   300,000
Objective-C      Java   J2ME/C++




HTML/Javascript   Java     .NET
portability
Objective-C      Java   J2ME/C++




HTML/Javascript   Java     .NET
Webkit browser    Webkit browser   J2ME/C++




 Webkit browser   Webkit browser     .NET
WebDatabases
WebDatabases


Location information
       (GPS)
WebDatabases


Location information
       (GPS)

      Canvas
WebDatabases


Location information
       (GPS)

      Canvas

  Multi-touch
WebDatabases


Location information
       (GPS)
                       Offline support
      Canvas

  Multi-touch
WebDatabases
                 Full-screen support
Location information
       (GPS)
                       Offline support
      Canvas

  Multi-touch
WebDatabases
                 Full-screen support
Location information
       (GPS)
                       Offline support
      Canvas
                 Accelerator support
  Multi-touch
Address book
Address book
  Camera
Address book
  Camera
  Compass
Address book
  Camera
  Compass
   File IO
Address book
  Camera
  Compass
   File IO
   Audio
Address book
  Camera
  Compass
   File IO
   Audio
Notifications
mobl program
today
1. language

2. behind the scenes
language
user interface

   styling

data modeling

  scripting

web services
user interface
demo
ui syntax


screen name(farg*) : ReturnType? {
  screenelem*
}


control name(farg*) {
  screenelem*
}
screen root() {
  ...
}
screen root() {
  ...
}


screen promptString(q : String) : String {
  ...
}
screen root() {
  ...
}


screen promptString(q : String) : String {
  ...
}


control button(s : String,
               onclick : Callback = {}) {
  ...
}
control calls

variable declarations

  control structures

      inline HTML


      script blocks
control calls
button("Click me")
control calls
button("Click me")


button("Click me", {
   alert("Click!");
})
control calls
button("Click me")


button("Click me", {
   alert("Click!");
})


button("Click me", onclick={
   alert("Click!");
})
control calls with body


  group() {
    item() { "Item 1" }
    item() { "Item 2" }
  }
control calls with body


  group {
    item { "Item 1" }
    item { "Item 2" }
  }
variable declarations

var b = true
variable declarations

var b = true
var b : Bool = true
variable declarations

var b = true
var b : Bool = true
var newTask = Task()
variable declarations

var   b = true
var   b : Bool = true
var   newTask = Task()
var   newTask : Task = Task()
when


var b = true

checkBox(b)

when(b) {
  label("Yep")
} else {
  label("Nope")
}
list


var nums = [1, 2, 3]

group {
  list(n in nums) {
    item { label(n) }
  }
}
inline HTML


<img src="img/icon.png"/>
inline HTML


   <img src="img/icon.png"/>


<div class=selected ? selectedStyle
                    : notSelectedStyle>
  ...
</div>
script blocks
         avoid if possible



var n = -1
script {
  n = Math.sqrt(9);
}
higher-order controls
demo
styling
style bigAndBlue {
  color:     blue;
  font-size: 40px;
}
Style
style bigAndBlue {
  color:      blue;
  font-size: 40px;
}
control block(style : Style) {
  ...
}

block(bigAndBlueStyle) {
  label("I am big and blue!");
}
style $baseColor = rgb(100, 100, 100)

style myStyle {
  color:     rgb($baseColor.r+10,
                 $baseColor.g+50,
                 $baseColor.b-20);
  font-size: 20px;
}
style mixin borderRadiusMixin($radius) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  border-radius: $radius;
}
style mixin borderRadiusMixin($radius) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  border-radius: $radius;
}


style myStyle {
  color:     $baseColor;
  borderRadiusMixin(10px);
}
demo
data modeling
   & query
entity   Task {
  name   : String (searchable)
  done   : Bool
  tags   : Collection<Tag> (inverse: tasks)
}


entity Tag {
  name : String (searchable)
  tasks : Collection<Task> (inverse: tags)
}
var newTask = Task(name="New task");
newTask.done = false;
add(newTask);
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
Collection<Task>
var tagDoneTasks = tag.tasks
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
Collection<Task>
var doneTasks = Task.all()
Collection<Task>
var doneTasks = Task.all()
                where done == true
                order by date desc
                limit 10;
Collection<Task>
var tagDoneTasks = tag.tasks
                   where done == true
                   order by date desc
                   limit 10;
Collection<Task>
var searchTasks = Task.search("task")
                  where done == true
                  limit 10;
screen root() {
  header("Tasks")
  group {
    list(t in Task.all() order by date desc) {
      item { label(t.name) }
    }
  }
}
scripting
script in ui


label("Total tasks: " + Task.all().count())
script in ui


label("Total tasks: " + Task.all().count())


button("Click me", onclick={
   alert("You clicked me!");
})
var n = 7;
var n2 = Math.round(n/2);

if(n2 > 3) {
  alert("More than three!");
} else {
  alert("Less than three!");
}
type inference
var n = 7;
var n2 = Math.round(n/2);

if(n2 > 3) {
  alert("More than three!");
} else {
  alert("Less than three!");
}
var done = 0;
foreach(t in Task.all()) {
  if(t.done) {
    done = done + 1;
  }
}
var done = 0;
foreach(t in Task.all()) {
  if(t.done) {
    done = done + 1;
  }
}



var done = (Task.all()
            where done == true)
           .count();
function sqr(n : Num) : Num {
  return n * n;
}
demo: todo list
web service
  access
service SomeService {
  resource tasks() : JSON {
    uri = "/tasks"
  }

    resource search(query : String) : JSON {
      uri = "/search?q=" + escape(query)
    }
}
ajax same-source restriction


service Twitter {
  resource trends() : JSON {
    uri = "/_proxy/api.twitter.com/1/trends.json"
  }

    resource search(query : String) : JSON {
      uri = "/_proxy/search.twitter.com/search.json?q="
            + escape(query)
    }
}
http://api.twitter.com/1/trends.json


{"trends":
  [{"url":"http://search.twitter.com/search?q=...",
     "name":"#ihaveadream"},
    {"url":"http://search.twitter.com/search?q=...",
     "name":"#mlkday"}
    ...
  ]
}
type Trend {
  name : String
  url : String
}

function trendsMapper(json : JSON) : [Trend] {
  return json.trends;
}
resource trends() : JSON {
  uri = "/_proxy/api.twitter.com/1/trends.json"
  mapper = trendsMapper
}
screen root() {
  var trends = Twitter.trends()

    header("Twitter trends")
    group {
      list(topic in trends) {
        item {
          label(topic.name)
        }
      }
    }
}
user interface

   styling

data modeling

  scripting

web services
limitations


slower than native


   no native UI


not great for games
behind the scenes
goals


 portability


completeness


  coverage
goals


 portability   web


completeness


  coverage
goals


 portability   web


completeness   100% code gen


  coverage
design bottom-up
roadmap
1. design core abstractions + native interface
roadmap
1. design core abstractions + native interface

2. enable user land abstractions
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
core abstraction:

synchronous programming


      no more asynchronous
          spaghetti code
synchronous programming


var results = Task.all().list();
for(var i = 0; i < results.length; i++) {
   alert(results[i].name);
}
render page




                 time
query database
 and process
    results




      ...
render page




                                  time
                 query database
browser freeze    and process
                     results




                       ...
render page

 send query




                time
     ...


process query
    result


     ...
asynchronous programming


Task.all.list(function(results) {
    for(var i = 0; i < results.length; i++) {
       alert(results[i].name);
    }
  });
...
Task.all().list(function(results) {
  alert("Hello, ");
});
alert("world!");
Task.all().list(function(results) {
  alert("Hello, ");
});                      breaks sequential
alert("world!");
                     execution assumption
Task.all().list(function(results) {
  // make changes
  ...
  persistence.flush(function() {
    alert("Changes saved!");
  });
});
continuation-passing style
     transformation
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
function displayLocationAndReturn() : Coordinates {
  var position = mobl::location::getPosition();
  log("Lat: " + position.latitude);
  log("Long: " + position.longitude);
  return position;
}




function displayLocationAndReturn(callback) {
   mobl.location.getPosition(function(position) {
     console.log("Lat: " + position.latitude);
     console.log("Long: " + position.longitude);
     callback(position);
   });
};
core abstraction:

 data binding

no more copying data from and
            to UI
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
var n = 8



var n = ref(8);
var n = 8



       var n = ref(8);

Observable
- set(value)
- get()
- addEventListener(eventType, callback)
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
label(n * n)




var node = $("<span>");
node.text(n.get() * n.get());
n.addEventListener("change", function() {
    node.text(n.get() * n.get());
});
root.append(node);
button("Inc", onclick={
     n = n + 1;
  })




var node = $("<button ...>");
node.text("Inc");
node.click(function() {
  n.set(n.get() + 1);
});
root.append(node);
button("Inc", onclick={
     n = n + 1;
  })




var node = $("<button ...>");
node.text("Inc");
node.click(function() {
  n.set(n.get() + 1);
});
root.append(node);
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
screen root() {
  var n = 8
  label(n * n)
  button("Inc", onclick={
     n = n + 1;
  })
}
core abstraction:

data modeling & query



       no more SQL
uses persistence.js
  http://persistencejs.org
entity Task {
  name          :   String (searchable)
  description   :   String (searchable)
  done          :   Bool
  date          :   DateTime
}




var Task = persistence.define('Task', {
  name:        'VARCHAR(255)',
  description: 'VARCHAR(255)',
  done:        'BOOL',
  date:        'DATE'
});

Task.textIndex('description');
Task.textIndex('name');
foreach(t in Task.all()) {
     alert(t.name);
   }




Task.all().forEach(function(t) {
  alert(t.name);
});
foreach(t in Task.all() where done == true) {
        alert(t.name);
      }




Task.all().filter("done", "=", true).forEach(function(t) {
  alert(t.name);
});
native interface
external entity MyEntity

external type MyType

external control contextMenu()

external screen specialScreen()

external sync function add(o : Object) : void

external style myStyle
external sync function add(o : Object) : void

<javascript>
__ns.add = function(o) {
    persistence.add(o);
};
</javascript>
load styles/default.css
load js/persistence.js
where do abstractions
    come from?
where do abstractions
    come from?

        domain
where do abstractions
    come from?

        domain

      experience
domain
screen



         domain
control

screen



         domain
control

screen              entity



         domain
control

screen              entity



         domain

 event
control

screen                 entity



         domain

 event              web service
experience
other DSLs



         experience
other DSLs



         experience


             programming
              paradigms
other DSLs                 annoyances



         experience


             programming
              paradigms
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
goal


       compiler small


library large (and extensible)
how?

- built-in types
- built-in controls

+ native interface
+ sufficiently low-level primitives
+ abstraction mechanisms (screens,
  controls, functions, types)
native interface
external type Object {
  sync function toString() : String
}

external type String : Object {
  length : Num
  sync function charAt(index : Num) : String
  sync function charCodeAt(index : Num) : Num
  ...
}

external   type   Num : Object { }
external   type   Bool : Object { }
external   type   Dynamic : Object { }
external   type   Style : String { }

external type Array<T> {
  length : Num

    sync function get(n : Num) : T
    sync function push(item : T) : void
    sync function join(sep : String) : String
    ...
}
low-level primitives


control image(url : String, onclick : Callback = null) {
  <img src=url onclick=onclick/>
}
low-level primitives

control slideupBlock() {
  div@<div onclick={
     div.slideUp();
  }>
     elements()
  </div>
}

...

slideupBlock {
  label("Click me to slide up")
}
low-level primitives

     control slideupBlock() {
JQuery div@<div onclick={
          div.slideUp();
       }>
          elements()
       </div>
     }

      ...

      slideupBlock {
        label("Click me to slide up")
      }
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
var doneTasks = Task.all()
var doneTasks = Task.all()
                .filter("done", "=", true)
                .order("date", false)
                .limit(10);
var doneTasks = Task.all()
var doneTasks = Task.all()
                where done == true
                order by date desc
                limit 10;
roadmap
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
load styles/default.css
div.header {
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
issue

out of sight,
                        no checking
out of mind


    <div class="headerr">
    </div>
little abstraction

div.header {
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
little abstraction

div.header {                                             mixins
  background: -webkit-gradient(linear, 0% 0%, 0% 100%,
                 from(rgb(72, 100, 180)), to(rgb(32, 60, 140)));
  background: -moz-linear-gradient(top, rgb(72, 100, 180),
                 rgb(32, 60, 140));
  padding: 0;
  height: 2.3em;
  font-size: 1.3em;
  line-height: 2.3em;
  font-weight: bold;
  text-align: center;
  text-shadow: #477 0px 1px 1px;
  color: white;
  font-weight: bold;
  margin: 0;
  z-index: 2;
}
1. design core abstractions + native interface

2. enable user land abstractions

3a. support successful ULAs with syntax

3b. support common native interface cases
    with core abstractions
http://www.mobl-lang.org

More Related Content

What's hot

From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Fabio Collini
 
ES6, WTF?
ES6, WTF?ES6, WTF?
ES6, WTF?
James Ford
 
Groovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトークGroovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトーク
Tsuyoshi Yamamoto
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
Takeshi Arabiki
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
Eugene Zharkov
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기
Suyeol Jeon
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
Takeshi Arabiki
 
Nosql hands on handout 04
Nosql hands on handout 04Nosql hands on handout 04
Nosql hands on handout 04Krishna Sankar
 
Baitap tkw
Baitap tkwBaitap tkw
Baitap tkw
nguyenquy2101
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
André Faria Gomes
 
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While TestingQA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QAFest
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
Eugene Zharkov
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Remy Sharp
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
Tor Ivry
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScript
niklal
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Fabio Collini
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureMike Fogus
 
Javascript
JavascriptJavascript
Javascript
Vlad Ifrim
 

What's hot (20)

From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
 
ES6, WTF?
ES6, WTF?ES6, WTF?
ES6, WTF?
 
Groovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトークGroovy ネタ NGK 忘年会2009 ライトニングトーク
Groovy ネタ NGK 忘年会2009 ライトニングトーク
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
 
Nosql hands on handout 04
Nosql hands on handout 04Nosql hands on handout 04
Nosql hands on handout 04
 
Pdxpugday2010 pg90
Pdxpugday2010 pg90Pdxpugday2010 pg90
Pdxpugday2010 pg90
 
Baitap tkw
Baitap tkwBaitap tkw
Baitap tkw
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
 
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While TestingQA Fest 2019. Saar Rachamim. Developing Tools, While Testing
QA Fest 2019. Saar Rachamim. Developing Tools, While Testing
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
 
Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScript
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of Clojure
 
Javascript
JavascriptJavascript
Javascript
 

Viewers also liked

Avoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree HuggingAvoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree Hugging
zefhemel
 
Frontrow conf
Frontrow confFrontrow conf
Frontrow confzefhemel
 
Internal DSLs
Internal DSLsInternal DSLs
Internal DSLs
zefhemel
 
Cloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js PoznańCloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js Poznań
zefhemel
 
WebWorkFlow
WebWorkFlowWebWorkFlow
WebWorkFlow
zefhemel
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Language
zefhemel
 

Viewers also liked (6)

Avoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree HuggingAvoiding JavaScript Pitfalls Through Tree Hugging
Avoiding JavaScript Pitfalls Through Tree Hugging
 
Frontrow conf
Frontrow confFrontrow conf
Frontrow conf
 
Internal DSLs
Internal DSLsInternal DSLs
Internal DSLs
 
Cloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js PoznańCloud9 IDE Talk at meet.js Poznań
Cloud9 IDE Talk at meet.js Poznań
 
WebWorkFlow
WebWorkFlowWebWorkFlow
WebWorkFlow
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Language
 

Similar to mobl - model-driven engineering lecture

mobl
moblmobl
mobl
zefhemel
 
Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & Engineering
Eelco Visser
 
mobl
moblmobl
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingDevnology
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Domenic Denicola
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
erwanl
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
Daniel Fisher
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
Daniel Cukier
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseHeiko Behrens
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and Monoids
Hugo Gävert
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
Michael Galpin
 
The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185
Mahmoud Samir Fayed
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
pootsbook
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
Laurence Svekis ✔
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
InfluxData
 
Software Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & SpoofaxSoftware Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & Spoofax
Eelco Visser
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 

Similar to mobl - model-driven engineering lecture (20)

mobl
moblmobl
mobl
 
Software Language Design & Engineering
Software Language Design & EngineeringSoftware Language Design & Engineering
Software Language Design & Engineering
 
mobl
moblmobl
mobl
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with EclipseEclipseCon2011 Cross-Platform Mobile Development with Eclipse
EclipseCon2011 Cross-Platform Mobile Development with Eclipse
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and Monoids
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
 
JQuery Flot
JQuery FlotJQuery Flot
JQuery Flot
 
The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
 
Software Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & SpoofaxSoftware Language Design & Engineering: Mobl & Spoofax
Software Language Design & Engineering: Mobl & Spoofax
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 

Recently uploaded

From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
CatarinaPereira64715
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
Fwdays
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 

Recently uploaded (20)

From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 

mobl - model-driven engineering lecture