joining lists into texts [was: Re: How would I optimize this parser?]

spir denis.spir at gmail.com
Sun Oct 31 04:07:56 PDT 2010


On Sat, 30 Oct 2010 23:00:59 -0400
bearophile <bearophileHUGS at lycos.com> wrote:

> - Keep in mind that ~ and ~= in arrays isn't a very fast operation. In some cases an Appender helps, and in some cases some workaround may be needed.

A use case of join (in std.string) is indeed to build a text from snippets.
But I personly use this func most often to build a text representation of list of elements of any kind. For this, join falls short:
* no auto-conversion to string
* no delimiters
Thus, I think the following may be useful in the stdlib (aside join):

=================================================
string listText(T)(T[] elements, string sep) {
    uint l = elements.length ;
    if (l == 0)
        return "" ;
    string[] texts ; texts.length = l ;
    foreach (uint i, T element ; elements)
        texts[i] = to!string(elements[i]) ;
    return join(texts, sep) ;
}
string listText(T)(T[] elements, string sep, string leftDelim, string rightDelim) {
    return format("%s%s%s", leftDelim, listText(elements, sep), rightDelim) ;
}

// testing
struct Symbol {
    string k;
    int v;
    string toString () {
        return format("%s:%s", this.k, to!string(this.v)) ;
    }
}

void main () {
    int[] ints = [1,2,3] ;
    writeln(listText(ints , "---")) ;
    writeln(listText(ints , " " , "(",")")) ;
    Symbol[3] symbols = [Symbol("a",1) , Symbol("b",2) , Symbol("c",3)] ;
    writeln(listText(symbols , " | " , "{ "," }")) ;
}

// writes:
1---2---3
(1 2 3)
{ a:1 | b:2 | c:3 }
==========================================

This works sensibly with any custom type where toString is defined. (else you get the type name ;-)

I would also love a mapping-func param, to allow expressing things like listText(ints, square, " "); but without optional parameters (AFAIK), combinations are problematic.

Also, I could not find functional methods like map, filter, reduce in std.functional. Where else? Also not in std.array. Map would be handy above to string-ify. And remove the need for a map func param in listText (I would be happy to contribute them if someone guides me on how to participate.)


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list