Hi,

I have given Groovy 2.5's new macro support a spin and implemented functionality to support code constructs which I could last use with C++'s macro preprocessor stringify operation (and which I always found very helpful for debugging / creating runtime log output).

Example:

final ageOfTree =124 final towerHeight =987.654 final String visitorName ="abc" final s1 ="DEFGH" final gs0 
="val0:$ageOfTree" final GString gs1 ="TheTower($towerHeight)" final List names = 
["Peter","Ann","Raymond" ]

println"single variables: ${NV(ageOfTree)}and ${NV(gs0)}and ${NV(visitorName)}and ${NV(s1)}and ${NV(gs1)}and also ${NV(names)})}" println"variable list: ${NVL(ageOfTree, gs0, visitorName, s1, towerHeight, gs1, names)}"which prints: single variables: ageOfTree=124 and gs0="val0:124" and visitorName="abc" and s1="DEFGH" and gs1="TheTower(987.654)" and also names=[Peter, Ann, Raymond])}variable list: [ageOfTree=124, gs0="val0:124", visitorName="abc", s1="DEFGH", towerHeight=987.654, gs1="TheTower(987.654)", names=[Peter, Ann, Raymond]]NV here is a Groovy macro method which, which allows turning the passed variable expression into its name and value in the form of a simple NameAndValue class instance. NVL does the same for multiple variables (returning a list of NameAndValue|s). (I used a different name for NVL, to allow for NV to take more than one variable expression parameter (and return e.g. a GString that contains a sequence of "name=$val" expressions without the enclosing list brackets), or to allow for NV to take additional parameters). Such an extension would be useful, because it:

1. Reduces the amount of boilerplate code one needs to write
2. Makes the code more concise
3. Removes errors such as: println "var0=$var0, var1=$var0"

I therefore propose we add this functionality to Groovy 2.5.x . Apart from the general decision, open questions for me are:

1. Where do we put macro extensions in the Groovy source code ?
2. What names should we use for macro methods ?

I lean towards using C/C++ macro naming conventions as a guideline, i.e. using short, abbreviated, uppercase-only names such as NV = named variable, or NVL = named variable list, since:

1. Macros allow for "magic" and are not really method calls in the
   classical sense
2. Java do not have macros, so the hope would be that making them stick
   out a bit will make them less confusing for developers coming from
   Java to Groovy
3. On the other hand C/C++ developers that are used to macros will
   immediately suspect that they are looking at a macro-like construct
4. Independent of upper-/lowercase, brevity is important, especially
   for the proposed two NV/NVL macros, since it would imho be desirable
   for e.g. "NV(x)" to not take up more space than "x=$x"

In any case macro-method support in Groovy is a fantastic feature, which opens up completely new possibilities for language & framework developers - Go Groovy !-)
Please comment,
Cheers,
mg





Reply via email to