DMD 0.170 release

Walter Bright newshound at digitalmars.com
Tue Oct 17 16:54:21 PDT 2006


Tom S wrote:
> ----
> 
> void each(int[] a, void delegate(int) dg, inout void* ret) {
>     for (int i = 0; i < a.length; ++i) {
>         dg(a[i]);
>         if (ret) return;
>     }
> }
> 
> 
> char[] foo() {
>     int[] arr;
>     arr ~= 5;
>     arr ~= 3;
>     arr ~= 2;
>     arr ~= 6;
> 
>     each (arr) (int a) {
>         if (1 == a) return "blah";
>         if (2 == a) return "hmm";
>         if (3 == a) break;
>     }
> 
>     return null;
> }
> 
> 
> void main() {
>     char[] str = foo();
>     printf("foo returned: %.*s\n", str);
> }
> 
> ----
> 
> 
> into:
> 
> 
> ----
> 
> void* CONTINUE    = cast(void*)0;
> void* BREAK        = cast(void*)1;
> 
> 
> void each(int[] a, void delegate(int) dg, inout void* ret) {
>     for (int i = 0; i < a.length; ++i) {
>         dg(a[i]);
>         if (ret) return;
>     }
> }
> 
> 
> char[] foo() {
>     int[] arr;
>     arr ~= 5;
>     arr ~= 2;
>     arr ~= 3;
>     arr ~= 6;
> 
>     {
>         char[]    retCode;
>         void*    ret;
> 
>         each(arr, (int a) {
>             if (1 == a) { retCode = "blah";    ret = &retCode; return; }
>             if (2 == a) { retCode = "hmm";    ret = &retCode; return; }
>             if (3 == a) { ret = BREAK; return; }
>         }, ret);
> 
>         if (ret !is BREAK && ret !is CONTINUE) return *cast(char[]*)ret;
>     }
> 
>     return null;
> }
> 
> 
> void main() {
>     char[] str = foo();
>     printf("foo returned: %.*s\n", str);
> }

That's a lot like how foreach is implemented now <g>.



More information about the Digitalmars-d-announce mailing list