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

Reply via email to