Thursday, October 20, 2011

Xtend - Type-safe Groovy-style Builder API

In this post I want to focus on two cool language features which are both interesting for themselves but even more so in combination.

The Implicit Variable 'it'

If you name your variable 'it' all its members are accessible without qualifying them with the variable reference (just like 'this').

Example:

def appendFoo(StringBuilder it) {
  append('foo')
}

Also note that variables with the name 'it' are the only ones which can be overridden in lexical scopes. So you could for instance write the following, where the lambda expressions argument shadows the outer variable it.

def foo(List<String> it) {
  foreach[ it | toUpperCase ]
}

Sugar For Lambdas With One Argument

Many languages have special syntactic sugar for lambdas with just one argument. So does Xtend. The usual syntax for a closure with one argument is :

  [Type arg | expression-using-arg ]

But as lambdas with one argument are a common case, you can leave out the paramter declaration as in :

  [expression-using-it]

And of course the name of the single argument will be 'it'.

Closures As Last Arguments

We added another feature, which is common in many other popular languages: If you invoke a method where the last argument is a closure you can place the closure after the actual method invocation.

Example:

  newArrayList('a','b','c').foreach [ toUpperCase ]

Groovy-style Builder Syntax

Using these three language enhancements in combination allows for defining statically-typed groovy-style builder APIs. Check the screencast to see it in action.

Interesting? See xtend-lang.org for more cool features.

3 comments:

  1. I like the use of it for simplifying certain expressions. The closure-after-method-call notation would be even nicer if a closure looked more like an ordinary block!

    On the forum, you mentioned a new syntax for creating object trees with a combined let/with construct. Will that be part of this release?

    ReplyDelete
  2. Hi Hallvard,

    what is described in the blog post has replaced the design I explained in the forum.

    ReplyDelete
  3. Hi Sven, What would you describe as the main difference between Groovy and Xtend? Or, more specifically, why (or when) should I use Xtend rather than Groovy (being mainly a normal Java developer so far)?

    ReplyDelete