More D newb questions.

Fawzi Mohamed fmohamed at mac.com
Sat May 10 08:02:47 PDT 2008


On 2008-05-10 14:00:16 +0200, Fawzi Mohamed <fmohamed at mac.com> said:

> On 2008-05-10 00:56:33 +0200, Derek Parnell <derek at psych.ward> said:
> 
>> On Fri, 9 May 2008 16:01:12 +0200, Fawzi Mohamed wrote:
>> 
>> 
>>> What you seem to want is an implicit cast of an element to an array
>>> with the single element.
>> 
>> I agree that this will cause more problems that it will solve. However, if
>> we rephrase your statement slightly ...
>> 
>> I want to be able to cast a single element to an array. What sort of syntax
>> (change) would that ability need and cost?
>> 
>> eg.
>>      T a, b;
>>      T[] foo = cast(T[])a ~ cast(T[])b;
>> 
>> But that is far to 'wordy' to be usable. I'd like something a lot more
>> simple and intuitive. Maybe a new operator so that we don't upset opCat. I
>> hereby propose an opJoin operator. It joins two elements to form an array.
>> 
>>      T a, b;
>>      T[] foo = a ~~ b;
>>      T[] bar = foo ~~ a;
>>      T[] qwe = b ~~ foo;
>> 
>> Is there ANY way that this SORT OF thing could be made to work in D?
> 
> using two test taken from tango.core.Variant
> 
> template isArray(T)
> {
>     static if( is( T U : U[] ) )
>         const isArray = true;
>     else
>         const isArray = false;
> }
> 
> template isStaticArray(T)
> {
>     static if( is( typeof(T.init)[(T).sizeof / typeof(T.init).sizeof] == T ) )
>         const isStaticArray = true;
>     else
>         const isStaticArray = false;
> }
> 
> template alwaysArrayT(T){
>   static if (isStaticArray!(T))
>     alias typeof(T.dup) alwaysArrayT;
>   else static if (isArray!(T))
>     alias T alwaysArrayT;
>   else
>     alias T[] alwaysArrayT;
> }
> 
> alwaysArrayT!(T) alwaysArray(T)(T x){
>   static if (isStaticArray!(T))
>     return x.dup;
>   static if (isArray!(T))
>      return x;
>   else
>     return [x];
> }
> 
> alwaysArray converts any type to a dynamic array, now what you want is
>   alwaysArray(a)~alwaysArray(b)
> 
> this makes sense in generic code, normally you know wether a in an 
> element or an array and you handle accordingly.
> If you want with this you can also implement directly your ~~ and it 
> would be more efficient (no temporary array for elements).
> In D 2.0 it should be nicer to write because the static arrays are more 
> uniform, and you can also use the traits.
> 
> Note that as noted by Janice alwaysArray has a fixed choice of which 
> array to use when given a scalar, so it cannot coexist with an 
> overloaded version that uses another array.
> 
> Fawzi

mmmh, I noticed that Janice beat me to it, I should get a better 
newbrowser, I hadn't seen it




More information about the Digitalmars-d mailing list