How would you do this in D?

Jose Armando Garcia jsancio at gmail.com
Tue May 10 17:55:43 PDT 2011


Good suggestion but I dislike the syntax for mixin template for this
use case. It looks like:

bool every(string file = __FILE__, int line = __LINE__)(int time)
{
   static int counter;
   if(++counter > time) counter -= time;

   return counter == 1;
}

works just fine. Hmmm!

On Tue, May 10, 2011 at 9:52 PM, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
> On 2011-05-10 17:32, 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?
>>
>> ---
>> 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() {}
>> ---
>
> My suggestion would be to use a string mixin. It would do essentially the same
> thing that the macro does.
>
> - Jonathan M Davis
>


More information about the Digitalmars-d mailing list