On 5/10/11 7:32 PM, Jose Armando Garcia wrote:
Hey guys,
I am trying to create a function that return true or executes
"something" the n-th time it is called from a specific call site. How
would you do that in D? In C we can do that with the help of
pre-processor macros. E.g.:
---
#include<assert.h>
#define EVERY(N, ACTION) { static int counter = 0; if(++counter> (N))
counter -= (N); if(counter == 1) (ACTION); }
int main()
{
int i = 0;
int j = 0;
while(i< 10)
{
EVERY(10, ++j);
EVERY(2, ++i);
}
assert(j == 2);
assert(i == 10);
}
---
In D, I hacked the following implementation. I don't like this
implementation for a log of reason... Am I missing some D feature? Can
someone do better?
[snip]
Just use a static variable inside a function parameterized by __FILE__
and __LINE__. Indeed the drawback is that two every() calls in one line
will share that static. I consider it a small matter. If it becomes a
bear we may as well add __COLUMN__ or something similar.
Note that the macro version has other, arguably larger, drawbacks - e.g.
it can't be used as an expression, evaluates the limit multiple times.
pollutes the global namespace etc.
Andrei