0
Internal DSLs in ScalaAndrey AdamovichAestas/IT
What’s in thispresentation? Definition and usage of DSLs Overview of Scala features that  can be used to create internal...
WORLD OF DSLS
What is DSL?Domain-Specific Language”   A Domain-Specific Language is a programming    language or executable specificatio...
Examples of DSL”                   Examples of domain-specific languages include:        HTML,        Logo for children...
Goals of DSL”      Use a more expressive language than a        general-purpose one       Share a common metaphor of    ...
What is internal DSL?”   Internal DSLs are particular    ways of using a host language    to give the host language the   ...
Library vs. DSL   Is there any difference between    a well-structured library or    API and an internal DSL?   Not much...
Fluent API”   In software engineering, a fluent    interface (as first coined by Eric Evans    and Martin Fowler) is an   ...
Fluent API examplesMockito       http://code.google.com/p/mockito/Guava     http://code.google.com/p/guava-libraries/
SCALA
Features of Scala Lightweight syntax Combines functional and object-  oriented aproaches Advanced type system:  everyth...
What makes internal DSLpossible in Scala? ”Dot-free”, infix and postfix  operator notation ”Bracket-free” function calls...
Lightweight syntaxval numbers = List(1, 2, 3)numbers map { x => x + 1 }numbers sortWith { (x, y) => x > y }numbers map { _...
Implicit conversionsMap( "first" -> "Test", "second" -> "Code" )/* Defines a new method sort for array objects */object im...
By-name parametersdebug("This" + " is" + " very" + " costly!")def debug(msg: => String): Unit =  if (isDebugEnabled()) pri...
Curryng I”   In mathematics and computer    science, currying is the technique    of transforming a function that    takes...
Curryng IIusing(new BufferedReader(new FileReader("file"))) { r =>  var count = 0  while (r.readLine != null) count += 1  ...
Advanced type system
DSL EXAMPLES
BaysickScalaBasicRunner.scala:object    ScalaBasicRunner extends Baysick with Application {    10    PRINT "Scala"    20  ...
Time DSLimport org.scala_tools.time.Imports._DateTime.nowDateTime.now.hour(2).minute(45).second(10)DateTime.now + 2.months...
Spring Integration DSLval messageFlow =     filter using        { payload: String => payload == "World" } -->     transfor...
READING MATERIAL
BooksProgramming in Scala, Second Edition Martin Odersky, Lex Spoon, and Bill                            Venners          ...
Links   http://www.scala-lang.org/   https://github.com/jorgeortiz85/scala-    time   http://blog.springsource.org/2012...
QUESTIONS
Upcoming SlideShare
Loading in...5
×

AestasIT - Internal DSLs in Scala

1,381

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,381
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "AestasIT - Internal DSLs in Scala"

  1. 1. Internal DSLs in ScalaAndrey AdamovichAestas/IT
  2. 2. What’s in thispresentation? Definition and usage of DSLs Overview of Scala features that can be used to create internal DSL Examples of Scala-based DSLs Some links and reading material Questions
  3. 3. WORLD OF DSLS
  4. 4. What is DSL?Domain-Specific Language” A Domain-Specific Language is a programming language or executable specification language that offers, through appropriate notations and abstractions, expressive power focused on, and usually restricted to, a particular problem domain.” The opposite is: • a general-purpose programming language, such as C, Java or Python, • or a general-purpose modeling language such as the Unified Modeling Language (UML).
  5. 5. Examples of DSL”    Examples of domain-specific languages include: HTML, Logo for children,  Verilog and VHDL hardware description languages,  Mata for matrix programming,  Mathematica and Maxima for symbolic mathematics,  spreadsheet formulas and macros,  SQL for relational database queries,  YACC grammars for creating parsers,  regular expressions for specifying lexers,  the Generic Eclipse Modeling System for creating diagramming languages,  Csound for sound and music synthesis,  and the input languages of GraphViz and GrGen, software packages used for graph layout and graph rewriting.
  6. 6. Goals of DSL”  Use a more expressive language than a general-purpose one  Share a common metaphor of understanding between developers and subject matter experts  Have domain experts help with the design of the business logic of an application  Avoid cluttering business code with too much boilerplate technical code thanks to a clean separation  Let business rules have their own lifecycle Guillaume Laforge Groovy Project Manager
  7. 7. What is internal DSL?” Internal DSLs are particular ways of using a host language to give the host language the feel of a particular language Martin Fowler
  8. 8. Library vs. DSL Is there any difference between a well-structured library or API and an internal DSL? Not much, except for the following: • Internal DSL does not look like code in host language • It’s more readable in general and is much closer to natural language
  9. 9. Fluent API” In software engineering, a fluent interface (as first coined by Eric Evans and Martin Fowler) is an implementation of an object oriented API that aims to provide for more readable code.” A fluent interface is normally implemented by using method chaining to relay the instruction context of a subsequent call (but a fluent interface entails more than just method chaining).
  10. 10. Fluent API examplesMockito http://code.google.com/p/mockito/Guava http://code.google.com/p/guava-libraries/
  11. 11. SCALA
  12. 12. Features of Scala Lightweight syntax Combines functional and object- oriented aproaches Advanced type system: everything has a type Strong type inference Performance comparable to Java Fully interoperable with Java
  13. 13. What makes internal DSLpossible in Scala? ”Dot-free”, infix and postfix operator notation ”Bracket-free” function calls (Almost) any character can be used in method names Implicit conversions Advanced type system By-name parameters and currying
  14. 14. Lightweight syntaxval numbers = List(1, 2, 3)numbers map { x => x + 1 }numbers sortWith { (x, y) => x > y }numbers map { _ + 1 } sortWith { _ > _ }numbers size
  15. 15. Implicit conversionsMap( "first" -> "Test", "second" -> "Code" )/* Defines a new method sort for array objects */object implicits extends Application { implicit def arrayWrapper[A : ClassManifest](x: Array[A]) = new { def sort(p: (A, A) => Boolean) = { util.Sorting.stableSort(x, p); x } } val x = Array(2, 3, 1, 4) println("x = "+ x.sort((x: Int, y: Int) => x < y))}
  16. 16. By-name parametersdebug("This" + " is" + " very" + " costly!")def debug(msg: => String): Unit = if (isDebugEnabled()) println(msg)spawn(println("I run in different thread!"))def spawn(p: => Unit) = { val t = new Thread() { override def run() = p } t.start() }
  17. 17. Curryng I” In mathematics and computer science, currying is the technique of transforming a function that takes multiple arguments (or an n-tuple of arguments) in such a way that it can be called as a chain of functions each with a single argument (partial application).
  18. 18. Curryng IIusing(new BufferedReader(new FileReader("file"))) { r => var count = 0 while (r.readLine != null) count += 1 println(count)}def using[T <: { def close() }] (resource: T) (block: T => Unit){ try { block(resource) } finally { if (resource != null) resource.close() }}
  19. 19. Advanced type system
  20. 20. DSL EXAMPLES
  21. 21. BaysickScalaBasicRunner.scala:object ScalaBasicRunner extends Baysick with Application { 10 PRINT "Scala" 20 LET (number := 1) 30 IF number > 0 THEN 50 40 PRINT "Java" 50 PRINT "rulez!" 60 END RUN}
  22. 22. Time DSLimport org.scala_tools.time.Imports._DateTime.nowDateTime.now.hour(2).minute(45).second(10)DateTime.now + 2.monthsDateTime.nextMonth < DateTime.now + 2.monthsDateTime.now to DateTime.tomorrow(DateTime.now to DateTime.nextSecond).millis2.hours + 45.minutes + 10.seconds(2.hours + 45.minutes + 10.seconds).millis2.months + 3.days
  23. 23. Spring Integration DSLval messageFlow = filter using { payload: String => payload == "World" } --> transform using { payload: String => "Hello " + payload } --> handle using { payload: String => println(payload) }messageFlow.send("World")
  24. 24. READING MATERIAL
  25. 25. BooksProgramming in Scala, Second Edition Martin Odersky, Lex Spoon, and Bill Venners DSLs in Action Debasish Ghosh
  26. 26. Links http://www.scala-lang.org/ https://github.com/jorgeortiz85/scala- time http://blog.springsource.org/2012/03/05/i ntroducing-spring-integration-scala-dsl/ http://blog.fogus.me/2009/03/26/baysick- a-scala-dsl-implementing-basic/ http://habrahabr.ru/post/98288/
  27. 27. QUESTIONS
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×