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