Why I loved D :)

Artur Skawina art.08.09 at gmail.com
Mon Oct 7 14:56:07 PDT 2013


On 10/07/13 23:04, Kozzi wrote:
> In my work we are rewriting some of ours modules from PHP to D. And today one of my colleague want to rewrite some of PHP code, where he use list statement. I never use this statement in PHP. So I do not know if there is a some alternative in D phobos. So I try to write my own solution. And it took approximately only one minute and that why I ove D.
> 
> Because I was able to implement same functionality with same syntax quite fast :).
> 
> Here is my solution. Yes I know, it is not perfect but it works :P.
> 
> import std.stdio;
> 
> struct list
> {
>     void*[] ptrs;
>     static list opCall(T...)(auto ref T vars)
>     {
> 
>         list ls;
>         foreach(ref var; vars)
>         {
>             ls.ptrs ~= &var;
>         }
>         return ls;
>     }
> 
>     void opAssign(T)(T[] values)
>     {
>         foreach(index, ptr; ptrs)
>         {
>             *(cast(T*)ptr) = values[index];
>         }
>     }
> }
> 
> void main(string[] args)
> {
>     int a, b, c;
>     list(a, b, c) = [1,2,3];
>     writeln(a);
>     writeln(b);
>     writeln(c);
> 
> }

Neat. But dangerous. You'll want type safety (ie using the same 'T'
everywhere) and 'ref' instead of 'auto ref' (the latter will accept
rvalues, so you could be taking an address of a local variable and
escaping it).

Let me try, with a slightly safer version:

   void list(A...)(typeof([A]) a) @property { foreach (I, ref _;  A) A[I] = a[I]; }

   void main(string[] args) {
       int a, b, c;

       list!(a, b, c) = [1, 2, 3];

       import std.stdio;
       writeln(a);
       writeln(b);
       writeln(c);
   }

SCNR. We need an IODCC. :^)

artur


More information about the Digitalmars-d mailing list