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