Groovy 2.5 på gaden - og 3'er på vej med flere kode-transformationer

Makroer i Groovy 2.5 kan give endnu mere knald på metagprogrammeringen.

Groovy 2.5 er fornylig blevet frigivet, og Groovy 3.0 er så småt på vej. Alpha 3 har været tilgængelig siden slutningen af ​​juni, og beta-versioner er planlagt til senere i år. Det færdige produkt forventes færdigt i starten af næste år.

Blandt nyhederne er en ny parser, med navnet Parrot.

Paul King, som er en central person i Groovy-miljøet, forklarer således om den nye parser til teknologibloggen Infoq:

»Groovys parser gør sit arbejde i flere faser. De første faser omskaber kildekoden til et abstrakt syntakstræ (AST). De senere faser konverterer AST til bytecode, som kører på JVM'en på næsten samme måde, som bytecode produceret fra en Java-compiler gør.«

Med Parrot-parseren er der tale om en helt ny måde at håndtere de tidlige kompileringstrin. Det skulle gøre miljøet mere fleksibelt og gøre det nemmere at inkorporere ændringer fra Java, så Groovy kan opnå 'cut-n-paste'-kompatibilitet med Java.

Læs også: Produktivitet fik konsulentfirma til at fravælge Java

I Groovy 2.5 er nyhederne blandt andet en makro-facilitet, der gør det nemmere at foretage metaprogrammering med AST-transformationer.

Det uddybes således i udgivelsesnoterne:

Hvis udvikleren eksempelvis vil skabe en @Info-transformation, som skaber en getInfo()-metode, når den indsættes i en klasse, har den traditionelle fremgangsmåde været noget i denne stil:

...
def clazz = new MethodCallExpression(new VariableExpression("this"), "getClass", EMPTY_ARGUMENTS)
def body = new ExpressionStatement(new MethodCallExpression(clazz, "getName", EMPTY_ARGUMENTS))
classNode.addMethod('getInfo', ACC_PUBLIC, STRING_TYPE, EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, body)
...

Med den nye makro-facilitet kan de to første linjer se sådan ud:

def body = macro(true) { getClass().name }

Det er også muligt at parametrisere makroerne, som med $v herunder :

def date = new ConstantExpression(new Date().toString())
def version = new ConstantExpression(GroovySystem.version)
def body = macro(true) {
    """\
    Name: ${getClass().name}
    Compiled: ${$v{ date }}
    Using Groovy version: ${$v{ version }}""".stripIndent()
}

Der er mere information om Groovy 2.5 i udgivelsesnoterne.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (0)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Log ind eller Opret konto for at kommentere