Rant: Date and Time fall short of simplicity in D
Steven Schveighoffer
schveiguy at yahoo.com
Mon Apr 1 06:41:28 PDT 2013
On Sun, 31 Mar 2013 06:00:53 -0400, Lars T. Kyllingstad
<public at kyllingen.net> wrote:
> On Saturday, 30 March 2013 at 02:46:27 UTC, Steven Schveighoffer wrote:
>> On Fri, 29 Mar 2013 18:08:28 -0400, Jonathan M Davis
>> <jmdavisProg at gmx.com> wrote:
>>
>>> std.conv.to is the standard way to convert one type to another. I see
>>> no
>>> reason to introduce stuff specific to core.time or std.datetime to do
>>> conversions. It should just hook into the standard stuff for that. If
>>> everything uses std.conv.to for coverting between types, then you
>>> don't have
>>> to worry about figuring out how a particular programmer decided that
>>> their API
>>> should do it - be it with casts or asOtherType toOtherType or whatever.
>>> std.conv.to is specifically designed so that any type can hook their
>>> own
>>> conversions into it, and then you can just always use std.conv.to for
>>> converting types.
>>
>> But the one doing the work is core.time. In essence, you have locked
>> away part of the API behind cast, and in order to get it out without
>> using cast, you have to import another module.
>>
>> opCast is just a function, it could easily be called opTo, or simply
>> to(T)().
>
> Now that we have the UFCS, std.conv.to should simply be implemented as:
>
> T to(F, T)(F from)
> {
> T t;
> from.convert(t);
> return t;
> }
>
> Then, std.conv should provide convert() functions for built-in types,
> e.g.
>
> void convert(wstring from, ref string to);
> void convert(long from, ref int to);
> etc.
>
> User-defined types could define their own convert method:
>
> struct MyType
> {
> void convert(ref MyOtherType tgt);
> }
>
> This is both safer and more flexible than using opCast(), since
>
> 1. you avoid the unfortunate association with the cast operator,
> 2. convert() can be virtual if desired,
> 3. convert() can be called directly to modify the target variable
> in-place.
I don't think this is flexible enough. It may not be enough to be able to
fill in another type.
But we don't need to go through ANY of this, just change T opCast(T)() to
T to(T)().
This way, with UFCS, a.to!B() will either call the method if available, or
std.conv.to (assuming it's imported).
-Steve
More information about the Digitalmars-d
mailing list