DIP 50 - AST macros

Walter Bright newshound2 at digitalmars.com
Wed Nov 13 11:25:20 PST 2013


On 11/13/2013 11:24 AM, Walter Bright wrote:
> Actually, there is a way to do this. I wrote an article years back on how to
> write "statement" workalikes using lazy function parameters. I suppose I should
> dig that up if I can find it.

Ah, found the code:

void ifthen(bool cond, lazy void dg)
{
     if (cond)
         dg();
}

void ifthen(bool cond, lazy void dgthen, lazy void dgelse)
{
     if (cond)
         dgthen();
     else
         dgelse();
}

void dotimes(int i, lazy int dg)
{
     for (int j = 0; j < i; j++)
         dg();
}

void switcher(bool delegate()[] cases...)
{
     foreach (c; cases)
     {
         if (c())
             break;
     }
}

bool scase(bool b, lazy void dg)
{
     if (b)
     {
         dg();
         return true;
     }
     return false;
}

bool sdefault(lazy void dg)
{
     dg();
     return true;
}

void whiler(lazy bool cond, lazy void bdy)
{
     while (cond())
         bdy();
}

void test1()
{
     int x = 3;
     dotimes(5, printf("%d\n", ++x));

     ifthen(true, printf("yes\n"));
     ifthen(false, printf("no\n"));

     ifthen(true, printf("yes\n"), printf("no\n"));
     ifthen(false, printf("yes\n"), printf("no\n"));

     int v = 2;
     switcher(
         scase(v == 1, printf("it is 1\n")),
         scase(v == 2, printf("it is 2\n")),
         scase(v == 3, printf("it is 3\n")),
         sdefault( printf("it is default\n"))
     );

     whiler( x < 100,
         (printf("%d\n", x), x *= 2)
     );
}


More information about the Digitalmars-d mailing list