phobos / tango / ares
Kevin Bealer
kevinbealer at gmail.com
Thu Feb 8 22:40:00 PST 2007
Lars Ivar Igesund wrote:
> Frits van Bommel wrote:
>
>> Which one to use is hard to say at this point. I've been trying out
>> Tango since its release and I like it but I sometimes miss some parts of
>> Phobos. Whether this is because Phobos is just more familiar to me or
>> actually better is hard to say...
>
> Note that what you miss that you feel you have in Phobos, is very much part
> of the feedback we would like.
>
Okay -- I'm really sorry if any of this seems to have a negative tone.
I hesitate to write this since I have a lot of respect for the Tango
design in general, but there are a couple of friction points I've noticed.
1. writefln / format replacements
Concerning standard output and string formatting, in phobos I can do
these operations:
writefln("%s %s %s", a, b, c);
format("%s %s %s", a, b, c);
How do I do these in Tango? The change to "{0} {1}" stuff is fine with
me, in fact I like it, but this syntax:
Stdout.formatln("{0} {1} {2}", a, b, c);
Format!(char).convert("{0} {1} {2}", a, b, c);
Is awkward. And these statements are used *all the time*. In a recent
toy project I wrote, I used Stdout 15 times, compared to using "foreach"
only 8 times. I also use the "format to string" idiom a lot (oddly
enough, not in that project), and it's even more awkward.
That's why I think phobos really did the "Right Thing" by keeping those
down to one token. Second, the fact that the second one does exactly
what the first does but you need to build a template, etc, is annoying.
I kept asking myself if I was doing the right thing because it seemed
like I was using too much syntax for this kind of operation (I'm still
not sure it's the best way to go -- is it?)
I know about Cout as a replacement for the first one, but as far as I
can tell it doesn't take parameters, and usually I need some.
When people ask "why D", I tell them that simpler syntax, better
defaults and better garbage collection, each gain us a 50 % reduction in
code, and when all three apply to a problem, D can each C++'s lunch.
Let's not throw away the simpler syntax.
(I'm not talking about architecture changes, just wrappers with
standardized short names that can become familiar to all D users.)
2. toString and toUtf8 (collisions)
The change of the terminology is actually okay with me.
But phobos has a way of using toString as both a method and a top-level
function name, all over the place. This gets really clumsy because you
can never use the top level function names when writing a class unless
you fully qualify them.
For example, std.cpuid.toString(), always has to be fully qualified when
called from a class, and seems nondescriptive anyway. All the
std.conv.toString() functions are nice but it's easy to accidentally
call the in-class toString() by accident.
For the utf8 <--> utf16 and similar, it's frustrating to have to do this:
dchar[] x32 = ...;
char[] x8 = tango.text.convert.Utf.toUtf8(x32);
But you have to fully qualify if you are writing code in any class or
struct. If these were given another name, like makeUtf8, then these
collisions would not happen.
Actually, if it wasn't already out there, I would want to go through all
of phobos and remove all the common collisions. They are much less
trouble in an "import" system than in an "include" system, but every
time there is a collision it requires an additional "edit-compile"
cycle, and/or a fully qualified name.
And if you forget to import all the right modules, its can impact the
correctness angle, because you pick up someone else's "toString" from
who knows where.
I'm just saying, ideally tango should not be duplicating this with
toUtf8 etc.
Kevin
More information about the Digitalmars-d-learn
mailing list