How would you do this in D?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue May 10 17:52:57 PDT 2011
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
More information about the Digitalmars-d
mailing list