Also, the D implementation breaks if you do:

if(every(x)) { ... } if(every(y)) { ...}

All on the same line.

On Tue, May 10, 2011 at 9:32 PM, Jose Armando Garcia <jsan...@gmail.com> 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?
>
> ---
> int[string] map;
>
> bool every(string file = __FILE__, int line = __LINE__)(int time)
> {
>   // assume file ~ "+" ~ to!string(line) is unique
>   // assumption could be removed by using a struct
>   string key = file ~ "+" ~ to!string(line);
>
>   map[key] += 1;
>   if(map[key] > time) map[key] -= time;
>
>   return map[key] == 1;
> }
>
> unittest
> {
>   auto i = 0;
>   auto j = 0;
>   while(i < 10)
>   {
>      if(every(10)) ++j;
>      if(every(2)) ++i;
>   }
>   assert(j == 2);
>   assert(i == 10);
> }
>
> void main() {}
> ---
>
> Thanks!
> -Jose
>

Reply via email to