[stringtemplate-interest] handling of arrays

Terence Parr parrt at cs.usfca.edu
Fri Feb 2 10:18:07 PST 2007


Weird....can't remember the error. Hang on.  Crap!  Now it works!

import java.util.*;
public class T {
         Object x = new String[3];
         List a = Arrays.asList((Object[])x);
}

Hmm....argh!  So should I remove the ArrayIterator etc...?

Oh!  It was a runtime error.  Got class cast exception.  Shite!  Now  
that is working too:

import java.util.*;
public class T {
         Object x = new String[3];
         List a = Arrays.asList((Object[])x);
         public static void main(String[] args) {
                 T t = new T();
                 System.out.println(t.a);
         }
}

1.4 and 1.5 allow that.  shite.

Ter

On Feb 1, 2007, at 12:22 PM, Nate wrote:

> That was in Eclipse with the compiler compliance level set to 1.4,  
> so it should work in 1.4. It should work in the same way as...
>
> String string = "abc";
> Object stringHiddenByObject = string;
>
> What compiler error did you get?
>
> -Nate
>
>
> Terence Parr wrote:
>> is that in java 1.5?  I don't it will work in 1.4.
>>
>> my compiler complained.
>>
>> ter
>>
>> On Feb 1, 2007, at 12:18 PM, Nate wrote:
>>
>>> It does work, I was wrong. In fact, you don't even need a cast...
>>>
>>> String[] strings = new String[] {"abc", "def", "ghi"};
>>> Object[] stringsHiddenByObjectArray = strings;
>>>
>>> What I was thinking of was going the other way...
>>>
>>> Object[] objects = new Object[] {"jkl", "mno", "pqr"};
>>> String[] thisDoesntWork = (String[])objects;
>>>
>>> -Nate
>>>
>>>
>>> Harry Karadimas wrote:
>>>> Sorry about the lengthy post, but I checked and found that the  
>>>> cast to
>>>> (Object[])
>>>> actually works !
>>>>
>>>> Below is a "small" demo  class that demonstrates various uses.
>>>> To make it short, what works is :
>>>>   public static Object convertArrayToList(Object value)
>>>>   {
>>>>     if (value==null || !value.getClass().isArray()) return value;
>>>>     return Arrays.asList((Object[])value);
>>>>   }
>>>>
>>>> --------
>>>>
>>>> package stringtemplate_test;
>>>>
>>>> import java.util.ArrayList;
>>>> import java.util.Arrays;
>>>> import java.util.Collection;
>>>> import java.util.Iterator;
>>>> import java.util.List;
>>>>
>>>> /**
>>>>  * "Lots of Lists", to test various Array to List conversion  
>>>> strategies
>>>>  * @author KARADIMAS
>>>>  */
>>>> public class Lol
>>>> {
>>>>   static Object[] myArray = {"A", "B", "C"};
>>>>   static List myList = new ArrayList();
>>>>   static Object[][][] threeLevels = {
>>>>       {
>>>>         {"1.1.1", "1.1.2", "1.1.3"},
>>>>         {"1.2.1", "1.2.2"}
>>>>       },
>>>>       {
>>>>         {"2.1.1"},
>>>>         {"2.2.1", "2.2.2"}
>>>>       },
>>>>       {
>>>>         {"3.1.1", "3.1.2"},
>>>>         {"3.2.1"}
>>>>       },
>>>>       {
>>>>         {myList}
>>>>       },
>>>>   };
>>>>   static int[] myInts = {1,2,3};
>>>>
>>>>   public static void main(String[] args)
>>>>   {
>>>>     //further init of myList
>>>>     myList.add("X");
>>>>     myList.add(myArray);
>>>>     myList.add("Z");
>>>>     System.out.println("Original list :");
>>>>     printList(threeLevels);
>>>>     System.out.println("convertArrayToList1() :");
>>>>     Object r = convertArrayToList1(threeLevels);
>>>>     printList((List) r);
>>>>     System.out.println("convertArrayToList2() :");
>>>>     r = convertArrayToList2(threeLevels);
>>>>     printList((List) r);
>>>>     System.out.println("convertAllForStUsage() :");
>>>>     r = convertAllAtOnce(threeLevels);
>>>>     printList((List) r);
>>>>     r = convertArrayToList1(myInts);
>>>>     printList(r);
>>>>   }
>>>>
>>>>   /**
>>>>    * simplest, works ok if called before each use, maybe the best
>>>> approach if
>>>>    * used in lazy (= just in time) execution.
>>>>    * Note here that Object[][]...[] is an instance of Object[]  
>>>> (and of
>>>>    * Object, incidentally)
>>>>    */
>>>>   public static Object convertArrayToList1(Object value)
>>>>   {
>>>>     if (value==null || !value.getClass().isArray()) return value;
>>>>     return Arrays.asList((Object[])value);
>>>>   }
>>>>
>>>>   /**
>>>>    * handles sub-arrays recursively at once, but what about arrays
>>>> inside lists?
>>>>    */
>>>>   public static Object convertArrayToList2(Object value)
>>>>   {
>>>>     if (value==null || !value.getClass().isArray()) return value;
>>>>     Object[] oa1 = (Object[]) value;
>>>>     Object[] oa2 = new Object[oa1.length];
>>>>     System.arraycopy(oa1, 0, oa2, 0, oa1.length);
>>>>     for (int i = 0; i < oa2.length; i++) oa2[i] =
>>>> convertArrayToList2(oa2[i]);
>>>>     return Arrays.asList(oa2);
>>>>   }
>>>>
>>>>   /**
>>>>    * More complex method.
>>>>    * Manages both lists and arrays, but what about arrays inside  
>>>> maps, for
>>>>    * example ? And also, why convert now arrays that might never  
>>>> be used ?
>>>>    */
>>>>   public static Object convertAllAtOnce(Object value)
>>>>   {
>>>>     if ( !isListable(value) ) return value;
>>>>     ArrayList res = new ArrayList(); //we always return a new list
>>>>     if (value instanceof List) {
>>>>       //process the list
>>>>       List vList = (List) value;
>>>>       for (Iterator iter = vList.iterator(); iter.hasNext();) {
>>>>         res.add(convertAllAtOnce(iter.next()));
>>>>       }
>>>>       return res;
>>>>     }
>>>>     //it's an array, process its elements
>>>>     Object[] oa = (Object[]) value;
>>>>     for (int i = 0; i < oa.length; i++)
>>>> res.add(convertAllAtOnce(oa[i]));
>>>>     return res;
>>>>   }
>>>>
>>>>   /** helper function to clarify code */
>>>>   private static final boolean isListable(Object o)
>>>>   {
>>>>     return (o instanceof List) || (o != null && o.getClass 
>>>> ().isArray());
>>>>   }
>>>>
>>>>   public static void printList(Object v) { printList("", v); }
>>>>
>>>>   public static void printList(String indent, Object v) {
>>>>     if (!isListable(v)) {
>>>>       System.out.println(indent+"v="+v);
>>>>       return;
>>>>     }
>>>>     if (v instanceof List) {
>>>>       System.out.println(indent+"(");
>>>>       List lst = (List) v;
>>>>       for (Iterator iter = lst.iterator(); iter.hasNext();) {
>>>>         Object o = (Object) iter.next();
>>>>         printList(indent+"  ", o);
>>>>       }
>>>>       System.out.println(indent+")");
>>>>       return;
>>>>     }
>>>>     Object[] oa = (Object[]) v;
>>>>     System.out.println(indent+"[//array");
>>>>     for (int i = 0; i < oa.length; i++) printList(indent+"  ", oa 
>>>> [i]);
>>>>     System.out.println(indent+"]//array");
>>>>   }
>>>>
>>>> }
>>>>
>>>>                                                        Harry  
>>>> Karadimas
>>>> / 
>>>> ___________________________________________________________________ 
>>>> ___
>>>> Dr Harry Karadimas  Medecin Ingenieur resp. Recherche et  
>>>> Developpement
>>>> Departement d'Information Hospitalier
>>>> CHU Henri Mondor 51, av. du Mal de Lattre de Tassigny   94010   
>>>> CRETEIL
>>>> tel : (00 33 1) 49 81 21 79                fax : (00 33 1) 49 81  
>>>> 27 08
>>>> secr.: (00 33 1) 49 81 23 82 m.el.:harry.karadimas at hmn.ap-hop- 
>>>> paris.fr
>>>> /
>>>>
>>>>
>>>> stringtemplate-interest-request at antlr.org a écrit :
>>>>> Send stringtemplate-interest mailing list submissions to
>>>>>     stringtemplate-interest at antlr.org
>>>>>
>>>>> To subscribe or unsubscribe via the World Wide Web, visit
>>>>>     http://www.antlr.org:8080/mailman/listinfo/stringtemplate- 
>>>>> interest
>>>>> or, via email, send a message with subject or body 'help' to
>>>>>     stringtemplate-interest-request at antlr.org
>>>>>
>>>>> You can reach the person managing the list at
>>>>>     stringtemplate-interest-owner at antlr.org
>>>>>
>>>>> When replying, please edit your Subject line so it is more  
>>>>> specific
>>>>> than "Re: Contents of stringtemplate-interest digest..."
>>>>>
>>>>>
>>>>> Today's Topics:
>>>>>
>>>>>    1. Re: handling of arrays (John Snyders) (Terence Parr)
>>>>>    2. Re: handling of arrays (John Snyders) (Terence Parr)
>>>>>    3. Re: Porting StringTemplate (Kay Roepke)
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------ 
>>>>> ----
>>>>>
>>>>> Message: 1
>>>>> Date: Tue, 30 Jan 2007 12:14:43 -0800
>>>>> From: Terence Parr <parrt at cs.usfca.edu>
>>>>> Subject: Re: [stringtemplate-interest] handling of arrays (John
>>>>>     Snyders)
>>>>> To: Nate <misc at n4te.com>
>>>>> Cc: StringTemplate <stringtemplate-interest at antlr.org>
>>>>> Message-ID: <E02F2DC0-7AE7-4B2B-A69A-49E19AD2CCE8 at cs.usfca.edu>
>>>>> Content-Type: text/plain; charset=ISO-8859-1; delsp=yes;  
>>>>> format=flowed
>>>>>
>>>>> crap.  Ok, back to arrayiterator then.
>>>>> Ter
>>>>> On Jan 30, 2007, at 11:54 AM, Nate wrote:
>>>>>
>>>>>
>>>>>> Unless you are using Java 5+, you'd have to use  
>>>>>> System.arrayCopy to
>>>>>> copy the array to an Object array.
>>>>>>
>>>>>> -Nate
>>>>>>
>>>>>>
>>>>>> Terence Parr wrote:
>>>>>>
>>>>>>> Awesome!  Heh, it's exactly what we want I think.
>>>>>>>
>>>>>>> Wait, class cast issue:
>>>>>>>
>>>>>>>     public static Object convertArrayToList(Object value) {
>>>>>>>         if ( value==null ) {
>>>>>>>             return null;
>>>>>>>         }
>>>>>>>         if ( value.getClass().isArray() ) {
>>>>>>>             return Arrays.asList((Object[])value);  // CAST  
>>>>>>> ISSUE!
>>>>>>>         }
>>>>>>>         return value;
>>>>>>>     }
>>>>>>>
>>>>>>> won't work as value is not Object[] most of the time...but  
>>>>>>> how do
>>>>>>> you  get it to compile w/o the cast?
>>>>>>>
>>>>>>> Ter
>>>>>>>
>>>>>>> On Jan 30, 2007, at 9:13 AM, Harry Karadimas wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Hi, I don't know if that relates to the previous post, but java
>>>>>>>> *does* have something
>>>>>>>> to encapsulate an array into a list, and that is the "asList"
>>>>>>>> method of the java.util.Arrays
>>>>>>>> class.
>>>>>>>>
>>>>>>>> Object[] myArray = ...
>>>>>>>> List myList = Arrays.asList(myArray);
>>>>>>>>
>>>>>>>> Harry Karadimas
>>>>>>>> _______________________________________________________________ 
>>>>>>>> _____
>>>>>>>> __  Dr Harry Karadimas Medecin Ingenieur resp. Recherche et
>>>>>>>> Developpement Departement d'Information Hospitalier CHU Henri
>>>>>>>> Mondor 51, av. du Mal de Lattre de Tassigny 94010 CRETEIL tel :
>>>>>>>> (00  33 1) 49 81 21 79 fax : (00 33 1) 49 81 27 08 secr.:  
>>>>>>>> (00 33
>>>>>>>> 1) 49  81 23 82 m.el.:harry.karadimas at hmn.ap-hop-paris.fr
>>>>>>>>
>>>>>>>>
>>>>>>>> stringtemplate-interest-request at antlr.org a ?crit :
>>>>>>>>
>>>>>>>>
>>>>>>>>> Send stringtemplate-interest mailing list submissions to
>>>>>>>>> stringtemplate-interest at antlr.org To subscribe or unsubscribe
>>>>>>>>> via  the World Wide Web, visit http://www.antlr.org:8080/
>>>>>>>>> mailman/ listinfo/stringtemplate-interest or, via email,  
>>>>>>>>> send a
>>>>>>>>> message  with subject or body 'help' to stringtemplate- 
>>>>>>>>> interest-
>>>>>>>>> request at antlr.org You can reach the person managing the  
>>>>>>>>> list at
>>>>>>>>> stringtemplate-interest-owner at antlr.org When replying, please
>>>>>>>>> edit  your Subject line so it is more specific than "Re:
>>>>>>>>> Contents of  stringtemplate-interest digest..." Today's  
>>>>>>>>> Topics:
>>>>>>>>> 1. Re: handling  of arrays (John Snyders) 2. Re: inconsistency
>>>>>>>>> with length function  (Oliver Flege)
>>>>>>>>> -------------------------------------------------------------- 
>>>>>>>>> -----
>>>>>>>>> -- - Message: 1 Date: Sun, 28 Jan 2007 21:44:26 -0500 From:  
>>>>>>>>> "John  Snyders" <jjsnyders at rcn.com> Subject: Re:
>>>>>>>>> [stringtemplate- interest] handling of arrays To: "Terence
>>>>>>>>> Parr"  <parrt at cs.usfca.edu>,    "StringTemplate"  
>>>>>>>>> <stringtemplate-
>>>>>>>>> interest at antlr.org> Message-ID:
>>>>>>>>> <PMEOJKDLMMHOHNEAMPBGGEJMCAAA.jjsnyders at rcn.com> Content-Type:
>>>>>>>>> text/plain;    charset="US-ASCII"
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> -----Original Message----- From: stringtemplate-interest-
>>>>>>>>>> bounces at antlr.org [mailto:stringtemplate-interest-
>>>>>>>>>> bounces at antlr.org]On Behalf Of Terence Parr Sent: Saturday,
>>>>>>>>>> January 27, 2007 6:38 PM To: StringTemplate Subject: Re:
>>>>>>>>>> [stringtemplate-interest] handling of arrays On Jan 16, 2007,
>>>>>>>>>> at  9:40 PM, John Snyders wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> I noticed in ASTExpr.java the method convertArrayToList.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> it is. just done to make things consistent...else have to
>>>>>>>>>> check  for arrays everyone. gross, eh?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> It seems to me that this is wasteful. I have not looked  
>>>>>>>>>>> at it
>>>>>>>>>>> too deep but why not handle arrays like other collections  
>>>>>>>>>>> and
>>>>>>>>>>> wrap them in an ArrayIterator inside
>>>>>>>>>>> convertAnythingIteratableToIterator.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> Interesting...ArrayIterator, eh? Does Sun have a standard  
>>>>>>>>>> one?
>>>>>>>>>> I  don't see it. Do you mean I should create one real quick?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> There isn't one in the Java SDK (as far as I know) but jakarta
>>>>>>>>> commons has one http://jakarta.apache.org/commons/collections/
>>>>>>>>> api- release/org/apache/commons /collections/iterators/
>>>>>>>>> ArrayIterator.html ST probably shouldn't rely on this so you
>>>>>>>>> can  create your own. It is straight forward. I created one
>>>>>>>>> before I  found the one in commons collections. I can give  
>>>>>>>>> it to
>>>>>>>>> you if you  like (assuming I can find it). But again I didn't
>>>>>>>>> think this  through fully.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Ter _______________________________________________
>>>>>>>>>> stringtemplate-interest mailing list stringtemplate-
>>>>>>>>>> interest at antlr.org http://www.antlr.org:8080/mailman/ 
>>>>>>>>>> listinfo/
>>>>>>>>>> stringtemplate-interest
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> ------------------------------ Message: 2 Date: Mon, 29 Jan
>>>>>>>>> 2007  10:25:24 +0100 From: Oliver Flege <o.flege at market-
>>>>>>>>> maker.de>  Subject: Re: [stringtemplate-interest]  
>>>>>>>>> inconsistency
>>>>>>>>> with length  function To: StringTemplate <stringtemplate-
>>>>>>>>> interest at antlr.org>  Message-ID: <45BDBD84.4040707 at market-
>>>>>>>>> maker.de> Content-Type: text/ plain; charset=ISO-8859-1 Hi,
>>>>>>>>> Terence Parr wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>> I think that the length method in ASTExpr.java should be
>>>>>>>>>>> changed  as follows: From: } else if (attribute instanceof
>>>>>>>>>>> List) { i =  ((List)attribute).size(); } To: } else if
>>>>>>>>>>> (attribute instanceof  Collection) { i = ((List) 
>>>>>>>>>>> attribute).size
>>>>>>>>>>> (); }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> Howdy! OK, yep, good fix.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> even better would be } else if (attribute instanceof
>>>>>>>>> Collection)  { i = ((Collection)attribute).size(); } :)  
>>>>>>>>> Cheers,
>>>>>>>>> Oliver  ------------------------------
>>>>>>>>> _______________________________________________  
>>>>>>>>> stringtemplate-
>>>>>>>>> interest mailing list stringtemplate-interest at antlr.org  
>>>>>>>>> http://
>>>>>>>>> www.antlr.org:8080/mailman/listinfo/stringtemplate-interest  
>>>>>>>>> End
>>>>>>>>> of  stringtemplate-interest Digest, Vol 22, Issue 14
>>>>>>>>> *******************************************************
>>>>>>>>>
>>>>>>>>>
>>>>>>>> <harry.karadimas.vcf>
>>>>>>>> _______________________________________________
>>>>>>>> stringtemplate-interest mailing list
>>>>>>>> stringtemplate-interest at antlr.org
>>>>>>>> http://www.antlr.org:8080/mailman/listinfo/stringtemplate- 
>>>>>>>> interest
>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> stringtemplate-interest mailing list
>>>>>>> stringtemplate-interest at antlr.org
>>>>>>> http://www.antlr.org:8080/mailman/listinfo/stringtemplate- 
>>>>>>> interest
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ------------------------------
>>>>>
>>>>> Message: 2
>>>>> Date: Tue, 30 Jan 2007 13:13:24 -0800
>>>>> From: Terence Parr <parrt at cs.usfca.edu>
>>>>> Subject: Re: [stringtemplate-interest] handling of arrays (John
>>>>>     Snyders)
>>>>> To: StringTemplate <stringtemplate-interest at antlr.org>
>>>>> Message-ID: <5DE29967-5C4B-4700-8D51-EDB9CF147D51 at cs.usfca.edu>
>>>>> Content-Type: text/plain; charset=US-ASCII; delsp=yes;  
>>>>> format=flowed
>>>>>
>>>>> Ok, i made an array wrapper and iterator.  had to do both so a  
>>>>> list
>>>>> is not purely an iterator, which has sideeffects.
>>>>>
>>>>>     /** Do a standard conversion of array attributes to a  
>>>>> List.  Wrap the
>>>>>      *  array instead of copying like old version.  Make an
>>>>>      *  ArrayWrappedInList that knows to create an ArrayIterator.
>>>>>      */
>>>>>     public static Object convertArrayToList(Object value) {
>>>>>         if ( value==null ) {
>>>>>             return null;
>>>>>         }
>>>>>         if ( value.getClass().isArray() ) {
>>>>>             return new ArrayWrappedInList(value);
>>>>>         }
>>>>>         return value;
>>>>>     }
>>>>>
>>>>> ArrayWrappedInList creates ArrayIterator.  These are two new  
>>>>> classes.
>>>>>
>>>>> Pushed to depot.
>>>>>
>>>>> Ter
>>>>>
>>>>> On Jan 30, 2007, at 9:13 AM, Harry Karadimas wrote:
>>>>>
>>>>>
>>>>>> Hi, I don't know if that relates to the previous post, but java
>>>>>> *does* have something
>>>>>> to encapsulate an array into a list, and that is the "asList"
>>>>>> method of the java.util.Arrays
>>>>>> class.
>>>>>>
>>>>>> Object[] myArray = ...
>>>>>> List myList = Arrays.asList(myArray);
>>>>>>
>>>>>> Harry Karadimas ____
>>>>>>
>>>>>
>>>>>
>>>>> ------------------------------
>>>>>
>>>>> Message: 3
>>>>> Date: Wed, 31 Jan 2007 02:21:11 +0100
>>>>> From: Kay Roepke <kroepke at classdump.org>
>>>>> Subject: Re: [stringtemplate-interest] Porting StringTemplate
>>>>> To: Shane Witbeck <shane at digitalsanctum.com>
>>>>> Cc: StringTemplate <stringtemplate-interest at antlr.org>
>>>>> Message-ID: <6789A417-4627-450E-A443-BF753E93862F at classdump.org>
>>>>> Content-Type: text/plain; charset=windows-1252; delsp=yes;
>>>>>     format=flowed
>>>>>
>>>>>
>>>>> On Jan 28, 2007, at 1:04 AM, Shane Witbeck wrote:
>>>>>
>>>>>
>>>>>> It seems like porting to ECMAScript would be better strategically
>>>>>> since ActionScript is an extension of it and the amount of  
>>>>>> work out
>>>>>> there being done in JavaScript (AJAX, etc.).
>>>>>>
>>>>>> Shane
>>>>>>
>>>>>> On 1/27/07, Terence Parr <parrt at cs.usfca.edu> wrote:
>>>>>>
>>>>>>> This would be very involved and a huge project.  ANTLR doesn't
>>>>>>> generate ActionScript so you'd need to parse everything by hand.
>>>>>>>
>>>>>>>
>>>>>
>>>>> Porting StringTemplate isn't exactly easy, esp. since it uses  
>>>>> ANTLR
>>>>> v2. My attempts
>>>>> to do an Obj-C port haven't been exactly successful, mainly  
>>>>> because
>>>>> ANTLR v3 threw
>>>>> up parsing ST :(
>>>>>
>>>>> I don't think that parsing ST by hand is a viable option, since  
>>>>> it is
>>>>> a bit involved
>>>>> at times. I certainly wouldn't attempt it unless I was  
>>>>> desperate...
>>>>> In the long run, though, v3 should be able to handle ST easily and
>>>>> that would make
>>>>> it a lot easier (even if you'd need to write a new v3 target).
>>>>>
>>>>> As to the ECMAScript target, I'm not sure whether the current  
>>>>> engines
>>>>> are really fit to
>>>>> do recursive descent parsing in. All the engines I have seen have
>>>>> some real issues in
>>>>> regard to memory, ie. tend to be slow molasses (but I admit it  
>>>>> would
>>>>> a cool thing to have
>>>>> now and then).
>>>>>
>>>>> my 0.02?,
>>>>>
>>>>> -k
>>>>>
>>>>>
>>>> _______________________________________________
>>>> stringtemplate-interest mailing list
>>>> stringtemplate-interest at antlr.org
>>>> http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
>>>>
>>>
>>> _______________________________________________
>>> stringtemplate-interest mailing list
>>> stringtemplate-interest at antlr.org
>>> http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
>>
>



More information about the stringtemplate-interest mailing list