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