tags:

views:

551

answers:

6

I've seen BASIC and Apache Camel DSLs in Scala, and they're just fantastic. Any more examples of such DSLs?

+12  A: 

You have a good source in the MEAP (Early Access) book
alt text
DSL in action from Debasish Ghosh (blog: "Ruminations of a programmer)

Testing frameworks like scalatest are classic examples of DSL:

  test("pop is invoked on an empty stack") {     
    val emptyStack = new Stack[String]
    evaluating { emptyStack.pop() } should produce [NoSuchElementException]
    emptyStack should be ('empty)
  }

There are many others DSL-based frameworks out there:

  • specs: "Behaviour-Driven-Design framework"

  • internal DSLs

  • Squeryl: "A Scala ORM and DSL for talking with Databases with minimum verbosity and maximum type safety"

    def songCountByArtistId: Query[GroupWithMeasures[Long,Long]] =
      from(artists, songs)((a,s) =>
        where(a.id === s.artistId)
        groupBy(a.id)
        compute(count)
      )
VonC
Note to self: wait for it, it's gonna be legen...
VonC
... dary! After 3099 answers and 660 days, I finally got the [Legendary Badge](http://stackoverflow.com/badges/146/legendary) (even though [I had to insist a little bit](http://meta.stackoverflow.com/questions/57232/is-150-rep-cap-exceeded-alone-enough-for-legendary-badge)!)
VonC
Really good book. Also includes other languages so you can compare how DSLs feel in different languages.
Johannes Wachter
+4  A: 

lift-json provides a DSL to generate JSON. For example the following DSL:

("person" ->
  ("name" -> "Joe") ~
  ("age" -> 35) ~
  ("spouse" ->
    ("person" ->
      ("name" -> "Marilyn") ~
      ("age" -> 33)
    )
  )
)

creates the following JSON:

{ 
  "person": {
    "name": "Joe",
    "age": 35,
    "spouse": {
      "person": {
        "name": "Marilyn",
        "age": 33
      }
    }
  }
}
Joni
+1  A: 

Two good examples are the built-in DSLs for Parser Combinators and Actors. There is a SQL wrapper called DBC (not yet ready), here you can see how it looks like: http://scala.sygneca.com/libs/dbc

Landei
A: 

The ScalaQL paper (PDF) describes the implementation of an interesting DSL for language integrated database queries.

binil
A: 

XML in Scala is another example.

namin
+1  A: 

ScalaModules is a DSL for working with OSGi.

Another one is available with Apache Camel a platform for enterprise integration.

Scala-Query and Squeryl also provide DSLs for querying databases among other things.

ScalaTest is also an awesome example of what is possible.

Johannes Wachter