How to repeat an operator N times (simple loop)

I need to perform an action N times. What is the best way in D to do this?

for(uint i=0; i<N; i++) action(); foreach(uint i; 0.. N) action(); 

maybe something better? Ideally, I would like something like Groovy / Ruby times eg

 N.times { action(); } 

Is it possible?

+7
loops d d2
source share
2 answers

Yes maybe

 import std.stdio; import std.traits; void foo() { writeln("Do It!"); } void times(T,N)(N n, T action) if (isCallable!T && isIntegral!N) { static if (ParameterTypeTuple!action.length == 1 && isIntegral!(ParameterTypeTuple!action[0])) foreach (i; 0 .. n) action(i); else foreach (i; 0 .. n) action(); } void main(string[] args) { 10.times(&foo); 10.times({writeln("Do It!");}); 10.times((uint n){writeln(n + 1, " Round");}); } 

with argument support:

 import std.stdio; import std.traits; void foo() { writeln("Do It!"); } struct Step { alias n this; size_t n; this(size_t i) { n = i + 1; } } struct Index { alias n this; size_t n; } void times(T,N,A...)(N n, T action, A args) if (isCallable!T && isIntegral!N) { alias PTTAction = ParameterTypeTuple!action; static if (PTTAction.length >= 1) { alias FP = PTTAction[0]; static if (is(Index == FP) || is(Step == FP)) foreach (i; 0 .. n) action(FP(i), args); else action(args); } else foreach (i; 0 .. n) action(); } void main(string[] args) { 10.times(&foo); 10.times({writeln("Do It!");}); 10.times((Step n){writeln(n, " Step");}); 10.times((Index n, string msg){writeln(n, msg);}, " Index"); stdin.readln; } 

UPDATE:

to improve performance, you can use the alias template parameter for the action:

 void times(alias action,N)(N n) if (isCallable!action && isIntegral!N) { static if (ParameterTypeTuple!action.length == 1 && isIntegral!(ParameterTypeTuple!action[0])) foreach (i; 0 .. n) action(i); else foreach (i; 0 .. n) action(); } void main(string[] args) { 10.times!(foo); 10.times!({writeln("Do It!");}); 10.times!((uint n){writeln(n + 1, " Round");}); } 
+10
source share

Perhaps something like this?

 void loop(int n, void delegate() func) { foreach (i; 0 .. n) { func(); } } 

Using:

 loop(10, { writeln("Hello World!"); }); 
+4
source share

All Articles