DSLs in Scala & DB4O

85
present DSLs in Scala for MSI at HSMA Scala Scala Marcus Körner (@atla_) Johannes Wachter (@jow85) [1]

description

A presentation about DSLs in general, what Scala has to offer in terms of internal DSLs and finally a custom DSL example that uses the DB4O database.

Transcript of DSLs in Scala & DB4O

Page 1: DSLs in Scala & DB4O

present DSLs in Scala for MSI at HSMA

Scala

Scala

Marcus Körner (@atla_) Johannes Wachter (@jow85)

[1]

Page 2: DSLs in Scala & DB4O

2

Grande Cinnamon Dolce Latte with tripple shot with non-fat milk topped with whipped cream

[2]

Page 3: DSLs in Scala & DB4O

3

place orders (

new Order to buy(100 sharesOf ”IBM”)

limitPrice 300

allOrNone

using premiumPricing,

new Order to sell(200 bondsOf ”CISCO”)

limitPrice 300

allOrNone

using {

(qty, unit) => qty * unit - 500

}

)

Beispiel aus [DSLSINACTION]

[3]

Page 4: DSLs in Scala & DB4O

Was sind DSLs

Warum Scala?

DSL Beispiele in Scala

DB4O DSL

Agenda 4

Page 5: DSLs in Scala & DB4O

Was sind DSLs?

[4]

Page 6: DSLs in Scala & DB4O

DSL

˃ Domain Specific Language

• Oder auch Fluent API

˃ Domain – [Domäne]

• Problemorientiert

• „Fachsprache“

˃ Specific – [Speziell]

• Konkret entworfen für einen spezifischen Einsatzzweck

• Abgrenzung zur General Purpose Language

Allgemeine Definition

6

Page 7: DSLs in Scala & DB4O

Domäne

˃ Sammlung an Abläufen, Objekten und Rahmenbedingungen die Teil der Fachdomäne sind

˃ Brücke zwischen realen Objekten aus der Welt des Anwenders und Objekten eines Softwaresystems

˃ Domain-Driven-Design

• Schwerpunkt ist die Fachlichkeit und Fachlogik

• Ideales Einsatzgebiet für DSLs!

… oder auch Anwendungsdomäne

7

Page 8: DSLs in Scala & DB4O

Ausdrucksschwäche von GPLs Ocean ocean = new Ocean ();

Fish fish1 = new Fish ();

fish1.setSize(Size.TINY);

fish1.setColor(Color.RED);

Fish fish2 = new Fish ();

fish2.setSize(Size.MIDSIZE);

fish2.setColor(Color.BLUE);

Shark shark = new Shark ();

shark.setSize(Size.HUGE);

shark.setColor(Color.WHITE);

Jellyfish jellyfish = new Jellyfish ();

jellyfish.setSize(Size.SMALL);

Turtle turtle = new Turtle ();

turtle.setSize (Size.SMALL);

ocean.add (fish1);

ocean.add (fish2);

ocean.add (shark);

ocean.add (jellyfish);

ocean.add (turtle);

8

Page 9: DSLs in Scala & DB4O

Ausdrucksschwäche von GPLs Ocean ocean = new Ocean ();

Fish fish1 = new Fish ();

fish1.setSize(Size.TINY);

fish1.setColor(Color.RED);

Fish fish2 = new Fish ();

fish2.setSize(Size.MIDSIZE);

fish2.setColor(Color.BLUE);

Shark shark = new Shark ();

shark.setSize(Size.HUGE);

shark.setColor(Color.WHITE);

Jellyfish jellyfish = new Jellyfish ();

jellyfish.setSize(Size.SMALL);

Turtle turtle = new Turtle ();

turtle.setSize (Size.SMALL);

ocean.add (fish1);

ocean.add (fish2);

ocean.add (shark);

ocean.add (jellyfish);

ocean.add (turtle);

Wenn man eigentlich meint…

ocean (

fish (TINY, RED),

fish (SMALL, BLUE),

shark (HUGE, WHITE),

jellyfish (SMALL),

turtle (SMALL)

)

9

? ? ? ?

Page 10: DSLs in Scala & DB4O

Ausdrucksschwäche von GPLs Ocean ocean = new Ocean ();

Fish fish1 = new Fish ();

fish1.setSize(Size.TINY);

fish1.setColor(Color.RED);

Fish fish2 = new Fish ();

fish2.setSize(Size.MIDSIZE);

fish2.setColor(Color.BLUE);

Shark shark = new Shark ();

shark.setSize(Size.HUGE);

shark.setColor(Color.WHITE);

Jellyfish jellyfish = new Jellyfish ();

jellyfish.setSize(Size.SMALL);

Turtle turtle = new Turtle ();

turtle.setSize (Size.SMALL);

ocean.add (fish1);

ocean.add (fish2);

ocean.add (shark);

ocean.add (jellyfish);

ocean.add (turtle);

Mit Scala 2.8: Named Parameters

ocean (

fish (size=TINY, color=RED),

jellyfish (size=SMALL)

)

10

? ? ? ?

Page 11: DSLs in Scala & DB4O

Klassifizierung von DSLs

11

[5]

Page 12: DSLs in Scala & DB4O

Klassifizierung

˃ Es gibt zwei wesentliche Unterschiede bei DSLs

• Interne DSLs

• Externe DSLs

˃ Es gibt allerdings auch einige graphische DSLs

12

Page 13: DSLs in Scala & DB4O

Interne DSLs

˃ Eingebettet in eine Host-Sprache

• z. B. in Java, Groovy, Scala, Python, C# …

˃ Beeinflusst und limitiert von den Sprachmitteln der Host-Sprache

˃ Einige Vertreter

• LINQ (C#), Grails (Groovy), Lift (Scala), WebDSL (Scala)

13

Page 14: DSLs in Scala & DB4O

Externe DSLs

˃ Liegen meist in Form von Skripten oder interpretierbaren Text-Dateien vor

• Graphviz, (X)HTML

˃ Werden entweder

• interpretiert

• compiliert in eine andere Sprache (Xtext)

˃ Kennen wir alle nur zu gut…

• SQL, Ant-Skripte, Makefiles, XML Konfigurationen

14

Page 15: DSLs in Scala & DB4O

Graphische DSLs

˃ Graphische Modellierung einer Domäne

• UML, BPM

˃ Meist verbunden mit einem spezifischen Tool

• Bsp. Microsoft Oslo, JetBrains MPS, Intentional Domain Workbench

˃ Gut geeignet zum Dokumentieren

˃ Schlecht geeignet zum eigentlichen Entwickeln!

15

Page 16: DSLs in Scala & DB4O

Stand der Dinge

16

[6]

Page 17: DSLs in Scala & DB4O

Cream c = new WhippedCream ();

Coffee coffee = new

Coffee(”CinnamonDolce”,

TYPE_LATTE);

coffee.sized(4);

coffee.setDecaf

(”decaf none”);

coffee.addCream(c);

Naive API … ohne wirkliches Design

17

[7]

Page 18: DSLs in Scala & DB4O

Query API

Coffee coffee = new Coffee();

coffee.setSize(Size.Grande);

coffee.setType(Type.CinnamonDolceLatte);

coffee.setDecaf(DecafLimit.Full);

coffee.setMilk(Milk.NonFat);

coffee.setCream(Cream.WhippedCream);

… am Starbucks Beispiel

18

Page 19: DSLs in Scala & DB4O

Query API

Coffee coffee = new Coffee();

coffee.setSize(Size.Grande);

coffee.setType(Type.CinnamonDolceLatte);

coffee.setDecaf(DecafLimit.Full);

coffee.setMilk(Milk.NonFat);

coffee.setCream(Cream.WhippedCream);

… am Starbucks Beispiel

19

˃ Das geht doch schöner, oder?

Page 20: DSLs in Scala & DB4O

Builder-Pattern

[8]

Page 21: DSLs in Scala & DB4O

Das Builder-Pattern

˃ Grundlage • Mittels Method-Chaining Lesbarkeit von Query APIs

erhöhen

˃ Umsetzung • Ein oder mehrere Objekte die ein Fluent Interface

anbieten und in eine darunterliegende Query-API transformieren.

˃ Ziel • Soll ähnlich lesbar wie eine interne DSL sein

• Gutes Design für moderne APIs: Builder für die wichtigsten Objekte

… Expression-Builder

21

Page 22: DSLs in Scala & DB4O

Object o = new Object.Builder(General)

.configureA (A)

.configureB (B)

.configureC (C)

.build ();

Allgemeine Umsetzung … In Java

22

[9]

Page 23: DSLs in Scala & DB4O

Fluent-APIs (mit dem Builder-Pattern)

Coffee coffee = new Coffee.Builder

(Size.Grande, Type.CinnamonDolceLatte)

.with (DecafLimit.Half)

.with (Milk.Soy)

.with (Cream.WhippedCream)

.build();

… am Starbucks Beispiel

23

[10]

Page 24: DSLs in Scala & DB4O

Fluent-APIs (mit dem Builder-Pattern)

Coffee coffee = new Coffee.Builder

(Size.Grande, Type.CinnamonDolceLatte)

.with (DecafLimit.Half)

.with (Milk.Soy)

.with (Cream.WhippedCream)

.build();

… am Starbucks Beispiel

24

˃ Nicht schlecht, aber warum soviel Overhead?

[10]

Page 25: DSLs in Scala & DB4O

25

Code is written for people … and only then for computers!

[11]

Page 26: DSLs in Scala & DB4O

Ziele für DSLs

26

[12]

Page 27: DSLs in Scala & DB4O

Ziele

˃ Klare Wiedergabe der Absicht eines Systems

• Im Bezug auf die Domäne

˃ Einfachere Lesbarkeit

• flüssig

• Hin zu natürlicher Sprache

˃ Bessere Modellierung der Domäne

˃ Domänenexperten sollten DSL verstehen und lesen können

• Nicht zwingend selbst damit arbeiten (Wunschdenken)

Im Vordergrund

27

Page 28: DSLs in Scala & DB4O

Ziele

˃ Abstraktionsebene von Software erhöhen

˃ Software-Entwicklung erleichtern

˃ Zeit einsparen

• Bei der Kommunikation mit Domänen-Experten

• Beim Umsetzen von fachlichen Anforderungen

… langfristig

28

Page 29: DSLs in Scala & DB4O

Ziele

˃ Abstraktionsebene von Software erhöhen

˃ Software-Entwicklung erleichtern

˃ Zeit einsparen

• Bei der Kommunikation mit Domänen-Experten

• Beim Umsetzen von fachlichen Anforderungen

˃ Und nein, Entwickler wollen wir nicht abschaffen

• Hat bei COBOL auch nicht geklappt ;)

… langfristig

29

Page 30: DSLs in Scala & DB4O

Schwierigkeiten

˃ Korrekte Abbildung einer Domäne in einer gegebenen Sprache oftmals schwierig

˃ Anpassung an die Host-Sprache notwendig

˃ DSL fühlt sich „fremd“ an in der Host-Sprache

˃ Warum passt sich die Sprache nicht der Domäne an?

… bei der Umsetzung

30

Page 31: DSLs in Scala & DB4O

Roadmap für den Einsatz von DSLs … am Beispiel Scala

31

˃ Schritt 1 • Tests von Java Objekten mit Scala DSL

˃ Schritt 2 • Scala DSL als Smart-Wrapper

um Java Objekte herum

˃ Schritt 3 • Nicht-kritische Funktionalität mit Hilfe

einer Scala DSL modellieren

˃ Man muss nicht gleich Produktionscode auf Scala umstellen…

Page 32: DSLs in Scala & DB4O

Warum Scala?

32

[13]

Page 33: DSLs in Scala & DB4O

Warum Scala

˃ Weniger „Noise“

• Optionale Punkte beim Methodenaufruf

• Semikolon-Inferenz

• Typ-Inferenz

• Operatoren als Methoden und Infix-Operatoren

• Optionale Klammern (an manchen Stellen)

˃ Funktionale Aspekte

• Gleich mehr dazu

˃ Combinator Parsing (für externe DSLs)

… einsetzen für Domain Specific Languages?

33

Page 34: DSLs in Scala & DB4O

„Fluent“-ness von Scala Ohne

34

val s : Int = new Palm().get (new

Banana(3)).size;

Page 35: DSLs in Scala & DB4O

„Fluent“-ness von Scala mit Companion-Object und Type-Inference

35

val s : Int = new Palm().get (new

Banana(3)).size;

val s = Palm().get

(Banana(3)).size;

Page 36: DSLs in Scala & DB4O

„Fluent“-ness von Scala mit Punkt- und Semicolon-Inferenz

36

val s : Int = new Palm().get (new

Banana(3)).size;

val s = Palm().get

(Banana(3)).size;

val s = Palm() get (Banana(3)) size

Page 37: DSLs in Scala & DB4O

CLOSURES & FUNCTIONS

[14]

Page 38: DSLs in Scala & DB4O

CLOSURES & FUNCTIONS

˃ Anonyme Funktionen

˃ Verwendung von Variablen aus dem aktuellen Scope möglich

Closures

val greeting = "Welcome"

val greet : String => String = s => {

greeting + " " + s

}

println greet("MSI Course") // Welcome MSI Course

38

Page 39: DSLs in Scala & DB4O

CLOSURES & FUNCTIONS

Currying (1/2)

def uncurried(s:String, i:Int):String = {

s + i

}

println(uncurried("foo -> ", 1)) // foo -> 1

39

Page 40: DSLs in Scala & DB4O

CLOSURES & FUNCTIONS

Currying (2/2)

def curried(s:String)(i:Int):String = {

s + " " + i

}

val prefill = curried("foo") _

val execute = prefill(1)

println(execute) // foo 1

val control = curried("foo"){

1 + 10 - 12

}

println(control) // foo -1

40

Currying ermöglicht - Partially Applied

Functions - „Neue“

Kontrollstrukturen

Page 41: DSLs in Scala & DB4O

CLOSURES & FUNCTIONS

˃ „Magische Konvertierung“

˃ Vorhandene APIs erweitern

Implicit Conversions

41

class EnhancedInt(val int:Int){

def toBinaryString():String = {

// ...

}

}

implicit def intToEnhancedInt(i:Int):EnhancedInt={

new EnhancedInt(i)

}

println(12 toBinaryString) // 1100

Best Practice Implicit Conversions in Singleton Objects kapseln. import some.Object.*

Page 42: DSLs in Scala & DB4O

CASE CLASSES

[15]

Page 43: DSLs in Scala & DB4O

CASE CLASSES Idee

43

˃ Normale Klassen mit Modifier case

˃ Erhalten implizit erweiterte Funktionen

• Verwendbarkeit in Pattern Matching

• Implizites Companion Object

• Automatische Vergleichbarkeit

Page 44: DSLs in Scala & DB4O

CASE CLASSES

Definition und Verwendung

44

abstract class TrainWaggon

case class StandardWaggon(seats : Int)

extends TrainWaggon

case class BistroWaggon(seats : Int, bar : Boolean)

extends TrainWaggon

case class BaggageWaggon(capacity : Int)

extends TrainWaggon

StandardWaggon(50)

BistroWaggon(20, true)

BaggageWaggon(200)

Page 45: DSLs in Scala & DB4O

CASE CLASSES

Beispiel „Option“

45

val result : Option[String] = ... // Ergebnis einer

anderen Funktion

Some("Inhalt") // Es wurde ein Ergebnis erstellt und

zurückgeliefert

None // Es wurde kein Ergebnis erstellt

Page 46: DSLs in Scala & DB4O

PATTERN MATCHING

[17]

Page 47: DSLs in Scala & DB4O

PATTERN MATCHING Matching auf Werte

47

val input : String = "..." // Aus Eingaben, Dateien, ...

val choice = input match {

case "xml" => exportToXML

case "json" => exportToJSON

case "doc" => exportToWord

case "docx" if isDocxEnabled => exportToWord

case _ => invalidExport // Weitere Eingabenwerte

}

Page 48: DSLs in Scala & DB4O

PATTERN MATCHING

˃ Case Classes optimal verwendbar

˃ Elegante Steuerung des Kontrollflusses

Matching mit Objekten

48

val input : Option[String] = ... // Some("test"), None

input match {

case Some("foobar") => false

case Some("test") => true

case None => false

}

Page 49: DSLs in Scala & DB4O

PARTIAL FUNCTIONS

[18]

Page 50: DSLs in Scala & DB4O

PARTIAL FUNCTIONS

50

val match1 : PartialFunction[String, String] = {

case "pictures" => displayPictureGallery

case "about" => displayAboutInformation

}

val match2 : PartialFunction[String, String] = {

case "users" => displayUserList

case "news" => displayNews

}

match1("users")

// scala.MatchError

match2("users")

// führt displayUserList aus

match1 isDefinedAt "users"

// false

match2 isDefinedAt "users„

// true

Page 51: DSLs in Scala & DB4O

PARSER COMBINATORS

[19]

Page 52: DSLs in Scala & DB4O

PARSER COMBINATORS

52

object SimpleScala extends RegexpParsers {

val ID = """[a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])*"""r

val NUM = """[1-9][0-9]*"""r

def program = clazz*

// ...

def classPrefix = "class" ~ ID ~ "(" ~ formals ~ ")"

// ...

def expr: Parser[Expr] = factor ~ (

"+" ~ factor

| "-" ~ factor

)*

// ...

Parser direkt in Scala anhand einer DSL definieren. Beispiele: - JSON - SimpleScala - WebDSL

[MAGIC]

Page 53: DSLs in Scala & DB4O

Beispiele für DSLs in Scala

[20]

Page 54: DSLs in Scala & DB4O

Finance DSL in Scala

[21]

Page 55: DSLs in Scala & DB4O

Finance DSL in Scala

val fixedIncomeTrade =

200.discount_bonds(IBM)

.for_client(NOMURA)

.on(NYSE)

.at(72.ccy(USD))

aus DSLsinAction

Beispiel aus [DSLSINACTION]

55

Page 56: DSLs in Scala & DB4O

Finance DSL in Scala

val fixedIncomeTrade =

200 discount_bonds IBM

for_client NOMURA on NYSE at

72.ccy(USD)

aus DSLsinAction

Beispiel aus [DSLSINACTION]

56

Page 57: DSLs in Scala & DB4O

Starbucks DSL in Scala

[22]

Page 58: DSLs in Scala & DB4O

Starbucks Scala DSL

val o = order (

Tall (CinnamonDolceLatte decaf

None withMilk NonFat withCream

WhippedCream),

Grande (ConPanna decaf Half),

Venti (FlavoredLatte decaf None

withMilk Soy withCream

NoWhippedCream)

)

Beispiel für die Verwendung

58

Page 59: DSLs in Scala & DB4O

Starbucks Scala DSL

val o = order (

Tall (CinnamonDolceLatte decaf

None withMilk NonFat withCream

WhippedCream),

Grande (ConPanna decaf Half),

Venti (FlavoredLatte decaf None

withMilk Soy withCream

NoWhippedCream)

)

Schade ist…

59

Page 60: DSLs in Scala & DB4O

Starbucks Scala DSL

˃ Companion + apply () für order (…)

˃ Case Objects um „new“ zu entgehen

• Kaffeesorten (CinnamonDolceLatte, ConPanna…)

• Milchsorten (NonFat, Soy…)

• Größen (Tall, Venti, Grande…)

Verwendete Konzepte

60

Page 61: DSLs in Scala & DB4O

ScalaTest DSL

[23]

Page 62: DSLs in Scala & DB4O

ScalaTest DSL

class StackSpec extends FlatSpec with ShouldMatchers {

"A Stack" should "pop values in last-in-first-out order" in {

val stack = new Stack[Int]

stack.push(1)

stack.push(2)

stack.pop() should equal (2)

stack.pop() should equal (1)

}

it should "throw NoSuchElementException if an empty stack is popped" in {

val emptyStack = new Stack[String]

evaluating { emptyStack.pop() } should produce [NoSuchElementException]

}

}

http://www.scalatest.org

Beispiel von [SCALATEST]

62

Page 63: DSLs in Scala & DB4O

Und mehr

˃ ScalaModules [SCALAMODULES]

• Konfiguration von OSGi Bundles

˃ Squeryl [SQUERYL]

• Scala ORM und DSL für SQL-Datenbanken

˃ Baysick [BAYSICK]

• Scala DSL die BASIC implementiert

˃ Apache Camel DSL [CAMELDSL]

• DSL zur Integration von ESB Komponenten

… weitere Scala DSLs

63

Page 64: DSLs in Scala & DB4O

DB4O

[24]

[LOGOS]

Page 65: DSLs in Scala & DB4O

DB4O

˃ Interfaces: Predicate<T>, Comparator<T>

Native Queries

65

final ObjectSet<User> nativeQuery = database.query(new

Predicate<User>() {

@Override

public boolean match(final User o) {

final User user = o;

return user.getLastName().equals("Flanders")

&& user.getFirstName().endsWith("od");

}

});

Page 66: DSLs in Scala & DB4O

DB4O [SCADB4O] [SCADB4O2]

˃ Anonyme Klasse ersetzen durch Closure

˃ Transformation mit Implicit Conversions

Offensichtliche Vereinfachung für Native Queries

66

final ObjectSet<User> nativeQuery = database.query(new

Predicate<User>() { … });

db query { user : User => user.name.contains("t") }

implicit def toPredicate[T](predicate: T => Boolean) = {

new Predicate[T]() {

def `match`(entry: T): Boolean = {

predicate(entry)

}

}

}

Durch fehlende Kompatibilität mit Query Optimizer nicht „Production ready“

Page 67: DSLs in Scala & DB4O

DB4O

˃ Builder-Pattern

SODA Queries

67

final Query query = database.query();

query.constrain(User.class);

query.descend("firstName").constrain("Johannes");

query.descend("lastName").constrain("Wachter");

query.descend("birthday").constrain("1985").like();

query.descend("age").constrain("19").smaller();

final ObjectSet<User> execute = query.execute();

Page 68: DSLs in Scala & DB4O

DB4O

Idee

DB4O Abfragen SQL-ähnlich modellieren!

Komplexere DSL für SODA Queries (1/8)

68

Page 69: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (2/8)

69

db select User.getClass where(„name := “Bart“) and('age < 20)

Page 70: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (3/8)

70

db select User.getClass where(„name := “Bart“) and('age < 20)

ObjectContainer

implicit def oCToDSLOC(c : ObjectContainer):DSLObjectContainer =

DSLObjectContainer(c)

case class DSLObjectContainer(val c : ObjectContainer){…}

Page 71: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (4/8)

71

db select User.getClass where(„name := “Bart“) and('age < 20)

case class DSLQuery[T](query : Query, clazz : Class[T])

extends QueryUtil{

def where(constr : DSLConstraint):ExtendedDSLQuery[T]={…}

def order(order : DSLOrdering):DSLQuery[T]{…}

def execute()={…}

}

Page 72: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (5/8)

72

db select User.getClass where(„name := “Bart“) and('age < 20)

Symbol

implicit def sToConstr(s: Symbol):DSLConstraint={

DSLConstraint(symbol)

}

def :=(obj:Any):DSLConstraint={…}

Page 73: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (6/8)

73

abstract class Operator

case object SMALLER extends Operator

case object SMALLER_EQUAL extends Operator

case class DSLConstraint(s : Symbol,

var b : Any = 0,

var op : Operator = EQUALS){

def :=(obj:Any):DSLConstraint={…}

def ~|(obj:String):DSLConstraint={…}

}

„name := “Bart“

Page 74: DSLs in Scala & DB4O

DB4O Komplexere DSL für SODA Queries (7/8)

74

val res = c.operator match {

case EQUALS => q.descend(c.symbol.name)

.constrain(c.bound).equal

case SMALLER => q.descend(c.symbol.name)

.constrain(c.bound).smaller

case SMALLER_EQUAL =>

q.descend(c.symbol.name).constrain(c.bound).smaller()

.or(q.descend(c.symbol.name).constrain(c.bound).equal)

}

def or(c : DSLConstraint):ExtendedDSLQuery[T]={

q.constraints().or(constrain(q, c))

this

}

Page 75: DSLs in Scala & DB4O

DB4O

˃ Verwendete Scala Features

• Implicit Conversions

• Builder Pattern

• Case Objects

• Pattern Matching

˃ Typisches Beispiel: Wrapper für Bibliothek

˃ Viele Möglichkeiten APIs „lesbar“ abzubilden

Komplexere DSL für SODA Queries (8/8)

75

Page 76: DSLs in Scala & DB4O

THE DAWN OF DSLs

[25]

[LOGOS]

Page 77: DSLs in Scala & DB4O

DEMO

77

[26]

Page 78: DSLs in Scala & DB4O

SOURCECODE

http://github.com/jwachter/scala-db4o-dsl

Page 79: DSLs in Scala & DB4O

NOCH FRAGEN?

79

[27]

Page 80: DSLs in Scala & DB4O

Werbung

80

http://scala-southerngermany.mixxt.de/

Page 81: DSLs in Scala & DB4O

Quellen

[BAYSICK] http://blog.fogus.me/2009/03/26/baysick-a-scala-dsl-implementing-basic/

[STIME] http://github.com/jorgeortiz85/scala-time

[SCADB4O] http://matlik.net/blog/2007/11/28/scala-and-db4o-native-queries/

[SCADB4O2] http://www.matthewtodd.info/?p=68

[SQUERYL] http://squeryl.org/ [SCALATEST] http://www.scalatest.org

[DSLSINACTION] Debashish Ghosh – DSLs In Action (MEAP) (http://manning.com/ghosh/)

[MAGIC] Daniel Spiewak, http://www.codecommit.com/blog/scala/the-magic-behind-parser-combinators

[FOWLER] Martin Fowler, http://martinfowler.com/dslwip (News zum Buch unter http://martinfowler.com/snips/201005261418.html) [SCALAMODULES] http://wiki.github.com/weiglewilczek/scalamodules/ [CAMELDSL] http://camel.apache.org/scala-dsl.html

81

Page 82: DSLs in Scala & DB4O

Quellen

[1] XKCD, http://xkcd.com/353/ [2] http://www.flickr.com/photos/stephenccwu/3035854901/ [3] http://www.flickr.com/photos/travel_aficionado/2396814840/ [4] http://www.flickr.com/photos/leonardlow/340763653/ [5] http://www.flickr.com/photos/13698839@N00/3001363490/ [6] http://www.flickr.com/photos/spherical_perceptions/4634722058/ [7] http://www.flickr.com/photos/7202153@N03/4623364964/ [8] http://www.flickr.com/photos/v1ctory_1s_m1ne/3416173688/ [9] http://www.flickr.com/photos/gorbould/3083371867/ [10] http://www.flickr.com/photos/jpdaigle/4221047282/ [11] http://www.flickr.com/photos/trinity-of-one/20562069/ [12] http://www.flickr.com/photos/bogdansuditu/2377844553/ [13] http://www.flickr.com/photos/stuartmckenna/3104554689/ [14] http://www.flickr.com/photos/erikcharlton/421678891/

Bilder (1/3)

82

Page 83: DSLs in Scala & DB4O

Quellen

[15] http://www.flickr.com/photos/zkorb/1592677291/

[17] http://www.flickr.com/photos/mortimer/221051561/

[18] http://www.flickr.com/photos/flying_cloud/2666399483/

[19] http://www.flickr.com/photos/fattytuna/8586848/

[20] selbst fotografiert (Buch: Programming in Scala)

[21] http://www.flickr.com/photos/travel_aficionado/2396824478/

[22] http://www.flickr.com/photos/webel/2406479887/

[23] http://www.flickr.com/photos/whisperwolf/3487084290/

[24] http://www.flickr.com/photos/adesigna/3237575990/

[25] http://www.flickr.com/photos/mugley/4207122005/

[26] http://www.flickr.com/photos/jof/263652571/

[27] http://www.flickr.com/photos/themonnie/2500388784/

Bilder (2/3)

83

Page 84: DSLs in Scala & DB4O

Quellen

[LOGOS]

DB4O - http://www.db4o.com

LIFT - http://www.liftweb.net

WEBDSL - http://www.webdsl.org

Squeryl - http://max-l.github.com/Squeryl

ScalaTest - http://scalatest.org

Grails - http://www.grails.org

Scala - http://www.scala-lang.org

Groovy - http://groovy.codehaus.org

Ruby - http://ruby-lang.org

Python – http://www.python.org

Bilder(3/3)

84