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