Repeat: Difference between revisions

From Rosetta Code
Content added Content deleted
m (syntax highlighting fixup automation)
Line 10: Line 10:
{{trans|Python}}
{{trans|Python}}


<lang 11l>F repeat(f, n)
<syntaxhighlight lang="11l">F repeat(f, n)
L 1..n
L 1..n
f()
f()
Line 17: Line 17:
print(‘Example’)
print(‘Example’)


repeat(procedure, 3)</lang>
repeat(procedure, 3)</syntaxhighlight>


{{out}}
{{out}}
Line 30: Line 30:
This routine is a bit messy, and assumes the called routine doesn't clobber the zero-page memory used to maintain it. This can be modified to push/pop those values before/after the routine is executed.
This routine is a bit messy, and assumes the called routine doesn't clobber the zero-page memory used to maintain it. This can be modified to push/pop those values before/after the routine is executed.


<lang 6502asm>macro RepeatProc,addr,count ;VASM macro syntax
<syntaxhighlight lang="6502asm">macro RepeatProc,addr,count ;VASM macro syntax
; input:
; input:
; addr = the label of the routine you wish to call repeatedly
; addr = the label of the routine you wish to call repeatedly
Line 56: Line 56:
;JMP (z_L) and it will automatically replace it with the above during the assembly process.
;JMP (z_L) and it will automatically replace it with the above during the assembly process.
;This causes an indirect JMP to the routine. Its RTS will return execution to just after the "JSR Trampoline_RepeatProc"
;This causes an indirect JMP to the routine. Its RTS will return execution to just after the "JSR Trampoline_RepeatProc"
;and flow into the loop overhead.</lang>
;and flow into the loop overhead.</syntaxhighlight>


Once the macro and the underlying subroutine are created, this is very simple to use:
Once the macro and the underlying subroutine are created, this is very simple to use:
<lang 6502asm>RepeatProc foo,#20 ;perform the subroutine "foo" twenty times.</lang>
<syntaxhighlight lang="6502asm">RepeatProc foo,#20 ;perform the subroutine "foo" twenty times.</syntaxhighlight>
===Using self-modifying code===
===Using self-modifying code===
This version requires that your "wrapper" executes in RAM, so that it can be modified. For this to work, it is assumed that the routine you're using doesn't clobber Y, or require that its parameters are passed in by A or X (so admittedly this method is a bit limited, but if you use the zero page to hold the parameters you can set them up prior to calling the wrapper itself.
This version requires that your "wrapper" executes in RAM, so that it can be modified. For this to work, it is assumed that the routine you're using doesn't clobber Y, or require that its parameters are passed in by A or X (so admittedly this method is a bit limited, but if you use the zero page to hold the parameters you can set them up prior to calling the wrapper itself.
<lang 6502asm>RepeatProc:
<syntaxhighlight lang="6502asm">RepeatProc:
;input: low byte of desired function address in A
;input: low byte of desired function address in A
; high byte of desired function address in X
; high byte of desired function address in X
Line 73: Line 73:
dey
dey
bne smc_repeatproc
bne smc_repeatproc
rts</lang>
rts</syntaxhighlight>


=={{header|68000 Assembly}}==
=={{header|68000 Assembly}}==
This example code prints an exclamation point to the screen 4 times.
This example code prints an exclamation point to the screen 4 times.
It is assumed that the functions called do not clobber A5 or D7, as doing so would cause undefined behavior (read: a crash or a program counter "escape.")
It is assumed that the functions called do not clobber A5 or D7, as doing so would cause undefined behavior (read: a crash or a program counter "escape.")
<lang 68000devpac> lea foo,a5 ;function to execute
<syntaxhighlight lang="68000devpac"> lea foo,a5 ;function to execute
move.w #4-1,d7 ;times to repeat
move.w #4-1,d7 ;times to repeat
jsr Repeater
jsr Repeater
Line 96: Line 96:
MOVE.B #'!',D0
MOVE.B #'!',D0
JSR PrintChar
JSR PrintChar
rts</lang>
rts</syntaxhighlight>


{{out}}
{{out}}
Line 102: Line 102:


=={{header|Action!}}==
=={{header|Action!}}==
<lang Action!>DEFINE PTR="CARD"
<syntaxhighlight lang="action!">DEFINE PTR="CARD"


PROC OutputText(CHAR ARRAY s)
PROC OutputText(CHAR ARRAY s)
Line 133: Line 133:
PROC Main()
PROC Main()
Repeat(OutputText,"Action!",5)
Repeat(OutputText,"Action!",5)
RETURN</lang>
RETURN</syntaxhighlight>
{{out}}
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Repeat.png Screenshot from Atari 8-bit computer]
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Repeat.png Screenshot from Atari 8-bit computer]
Line 146: Line 146:
=={{header|Ada}}==
=={{header|Ada}}==


<lang Ada>with Ada.Text_IO;
<syntaxhighlight lang="ada">with Ada.Text_IO;


procedure Repeat_Example is
procedure Repeat_Example is
Line 164: Line 164:
begin
begin
Repeat(Hello'Access, 3); -- Hello'Access points to the procedure Hello
Repeat(Hello'Access, 3); -- Hello'Access points to the procedure Hello
end Repeat_Example;</lang>
end Repeat_Example;</syntaxhighlight>


Output:
Output:
Line 171: Line 171:
=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<lang algol68>
<syntaxhighlight lang="algol68">
# operator that executes a procedure the specified number of times #
# operator that executes a procedure the specified number of times #
OP REPEAT = ( INT count, PROC VOID routine )VOID:
OP REPEAT = ( INT count, PROC VOID routine )VOID:
Line 197: Line 197:


)
)
</syntaxhighlight>
</lang>
Output:
Output:
<pre>
<pre>
Line 210: Line 210:
=={{header|ALGOL W}}==
=={{header|ALGOL W}}==
As well as the names of procedures, Algol W allows statements to be passed as parameters where a procedure is expected.
As well as the names of procedures, Algol W allows statements to be passed as parameters where a procedure is expected.
<lang algolw>begin
<syntaxhighlight lang="algolw">begin
% executes the procedure routine the specified number of times %
% executes the procedure routine the specified number of times %
procedure repeat ( integer value count; procedure routine ) ;
procedure repeat ( integer value count; procedure routine ) ;
Line 228: Line 228:
)
)
end
end
end.</lang>
end.</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 238: Line 238:


=={{header|AppleScript}}==
=={{header|AppleScript}}==
<lang applescript>-- applyN :: Int -> (a -> a) -> a -> a
<syntaxhighlight lang="applescript">-- applyN :: Int -> (a -> a) -> a -> a
on applyN(n, f, x)
on applyN(n, f, x)
script go
script go
Line 320: Line 320:
end repeat
end repeat
return out & dbl
return out & dbl
end replicate</lang>
end replicate</syntaxhighlight>
{{Out}}
{{Out}}
<pre>(*1024*)
<pre>(*1024*)
Line 330: Line 330:


=={{header|Arturo}}==
=={{header|Arturo}}==
<lang rebol>print "---------------------------"
<syntaxhighlight lang="rebol">print "---------------------------"
print "As a loop"
print "As a loop"
print "---------------------------"
print "---------------------------"
Line 354: Line 354:
print "With a function param"
print "With a function param"
print "---------------------------"
print "---------------------------"
repeatFunc $[][print "Example 3"] 4</lang>
repeatFunc $[][print "Example 3"] 4</syntaxhighlight>


{{out}}
{{out}}
Line 381: Line 381:


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==
<lang AutoHotkey>repeat("fMsgBox",3)
<syntaxhighlight lang="autohotkey">repeat("fMsgBox",3)
return
return


Line 391: Line 391:
fMsgBox(){
fMsgBox(){
MsgBox hello
MsgBox hello
}</lang>
}</syntaxhighlight>


=={{header|AWK}}==
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f REPEAT.AWK
# syntax: GAWK -f REPEAT.AWK
BEGIN {
BEGIN {
Line 413: Line 413:
}
}
}
}
</syntaxhighlight>
</lang>
<p>output:</p>
<p>output:</p>
<pre>
<pre>
Line 425: Line 425:


=={{header|Batch File}}==
=={{header|Batch File}}==
<lang dos>
<syntaxhighlight lang="dos">
@echo off
@echo off


Line 443: Line 443:
echo _func2 has been executed
echo _func2 has been executed
exit /b
exit /b
</syntaxhighlight>
</lang>


=={{header|BQN}}==
=={{header|BQN}}==
Line 449: Line 449:
BQN has a builtin called Repeat which fulfills the criteria for the challenge(and allows multiple iteration counts), hence there is a recursive implementation of repeat added in as well.
BQN has a builtin called Repeat which fulfills the criteria for the challenge(and allows multiple iteration counts), hence there is a recursive implementation of repeat added in as well.


<lang bqn>•Show {2+𝕩}⍟3 1
<syntaxhighlight lang="bqn">•Show {2+𝕩}⍟3 1


_repeat_ ← {(𝕘>0)◶⊢‿(𝔽_𝕣_(𝕘-1)𝔽)𝕩}
_repeat_ ← {(𝕘>0)◶⊢‿(𝔽_𝕣_(𝕘-1)𝔽)𝕩}


•Show {2+𝕩} _repeat_ 3 1</lang><lang>7
•Show {2+𝕩} _repeat_ 3 1</syntaxhighlight><syntaxhighlight lang="text">7
7</lang>
7</syntaxhighlight>


=={{header|C}}==
=={{header|C}}==
<lang c>#include <stdio.h>
<syntaxhighlight lang="c">#include <stdio.h>


void repeat(void (*f)(void), unsigned int n) {
void repeat(void (*f)(void), unsigned int n) {
Line 472: Line 472:
return 0;
return 0;
}
}
</syntaxhighlight>
</lang>


=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==
{{trans|Java}}
{{trans|Java}}
<lang csharp>using System;
<syntaxhighlight lang="csharp">using System;


namespace Repeat {
namespace Repeat {
Line 493: Line 493:
}
}
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>Example 1
<pre>Example 1
Line 500: Line 500:


=={{header|C++}}==
=={{header|C++}}==
<lang cpp>template <typename Function>
<syntaxhighlight lang="cpp">template <typename Function>
void repeat(Function f, unsigned int n) {
void repeat(Function f, unsigned int n) {
for(unsigned int i=n; 0<i; i--)
for(unsigned int i=n; 0<i; i--)
f();
f();
}</lang>
}</syntaxhighlight>
usage:
usage:
<lang cpp>#include <iostream>
<syntaxhighlight lang="cpp">#include <iostream>
void example() {
void example() {
std::cout << "Example\n";
std::cout << "Example\n";
}
}


repeat(example, 4);</lang>
repeat(example, 4);</syntaxhighlight>
{{works with|C++11}}
{{works with|C++11}}
<lang cpp> repeat([]{std::cout << "Example\n";}, 4);</lang>
<syntaxhighlight lang="cpp"> repeat([]{std::cout << "Example\n";}, 4);</syntaxhighlight>


=={{header|Clojure}}==
=={{header|Clojure}}==
<lang clojure>(defn repeat-function [f n]
<syntaxhighlight lang="clojure">(defn repeat-function [f n]
(dotimes [i n] (f)))</lang>
(dotimes [i n] (f)))</syntaxhighlight>


{{out}}
{{out}}
Line 526: Line 526:


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
<lang lisp>(defun repeat (f n)
<syntaxhighlight lang="lisp">(defun repeat (f n)
(dotimes (i n) (funcall f)))
(dotimes (i n) (funcall f)))


(repeat (lambda () (format T "Example~%")) 5)</lang>
(repeat (lambda () (format T "Example~%")) 5)</syntaxhighlight>


=={{header|Cowgol}}==
=={{header|Cowgol}}==
<lang cowgol>include "cowgol.coh";
<syntaxhighlight lang="cowgol">include "cowgol.coh";


# Only functions that implement an interface can be passed around
# Only functions that implement an interface can be passed around
Line 554: Line 554:
# Prints "foo foo foo foo"
# Prints "foo foo foo foo"
Repeat(Foo, 4);
Repeat(Foo, 4);
print_nl(); </lang>
print_nl(); </syntaxhighlight>


=={{header|D}}==
=={{header|D}}==
<lang d>void repeat(void function() fun, in uint times) {
<syntaxhighlight lang="d">void repeat(void function() fun, in uint times) {
foreach (immutable _; 0 .. times)
foreach (immutable _; 0 .. times)
fun();
fun();
Line 569: Line 569:
void main() {
void main() {
repeat(&procedure, 3);
repeat(&procedure, 3);
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>Example
<pre>Example
Line 576: Line 576:


=={{header|Delphi}}==
=={{header|Delphi}}==
<syntaxhighlight lang="delphi">
<lang Delphi>
program Repeater;
program Repeater;


Line 604: Line 604:
end.
end.


</syntaxhighlight>
</lang>


Alternative
Alternative


<syntaxhighlight lang="delphi">
<lang Delphi>
program Repeater;
program Repeater;


Line 633: Line 633:
readln;
readln;
end.
end.
</syntaxhighlight>
</lang>




Line 642: Line 642:


=={{header|EchoLisp}}==
=={{header|EchoLisp}}==
<lang lisp>
<syntaxhighlight lang="lisp">
(define (repeat f n) (for ((i n)) (f)))
(define (repeat f n) (for ((i n)) (f)))


Line 656: Line 656:
(cos 0.7390851332151605)
(cos 0.7390851332151605)
→ 0.7390851332151608 ;; fixed point found
→ 0.7390851332151608 ;; fixed point found
</syntaxhighlight>
</lang>


=={{header|F#|F sharp}}==
=={{header|F#|F sharp}}==
<lang fsharp>open System
<syntaxhighlight lang="fsharp">open System


let Repeat c f =
let Repeat c f =
Line 672: Line 672:
Repeat 3 Hello
Repeat 3 Hello


0 // return an integer exit code</lang>
0 // return an integer exit code</syntaxhighlight>


=={{header|Factor}}==
=={{header|Factor}}==
Factor comes with the <tt>times</tt> word which does exactly this. For example,
Factor comes with the <tt>times</tt> word which does exactly this. For example,
<lang factor>3 [ "Hello!" print ] times</lang>
<syntaxhighlight lang="factor">3 [ "Hello!" print ] times</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 685: Line 685:


The implementation of <tt>times</tt>:
The implementation of <tt>times</tt>:
<lang factor>: times ( ... n quot: ( ... -- ... ) -- ... )
<syntaxhighlight lang="factor">: times ( ... n quot: ( ... -- ... ) -- ... )
[ drop ] prepose each-integer ; inline</lang>
[ drop ] prepose each-integer ; inline</syntaxhighlight>


=={{header|Forth}}==
=={{header|Forth}}==
<lang forth>: times ( xt n -- )
<syntaxhighlight lang="forth">: times ( xt n -- )
0 ?do dup execute loop drop ;</lang>
0 ?do dup execute loop drop ;</syntaxhighlight>


Or, taking care to keep the data stack clean for the XT's use, as is often desired:
Or, taking care to keep the data stack clean for the XT's use, as is often desired:


<lang forth>: times { xt n -- }
<syntaxhighlight lang="forth">: times { xt n -- }
n 0 ?do xt execute loop ;</lang>
n 0 ?do xt execute loop ;</syntaxhighlight>


Or as a novel control structure, which is not demanded by this task but which is just as idiomatic in Forth as the XT-consuming alternatives above:
Or as a novel control structure, which is not demanded by this task but which is just as idiomatic in Forth as the XT-consuming alternatives above:


<lang forth>: times[ ]] 0 ?do [[ ; immediate compile-only
<syntaxhighlight lang="forth">: times[ ]] 0 ?do [[ ; immediate compile-only
: ]times postpone loop ; immediate compile-only</lang>
: ]times postpone loop ; immediate compile-only</syntaxhighlight>


Usage:
Usage:


<lang forth>[: cr ." Hello" ;] 3 times
<syntaxhighlight lang="forth">[: cr ." Hello" ;] 3 times


: 3-byes ( -- ) 3 times[ cr ." Bye" ]times ;
: 3-byes ( -- ) 3 times[ cr ." Bye" ]times ;
3-byes</lang>
3-byes</syntaxhighlight>


{{out}}<pre>Hello
{{out}}<pre>Hello
Line 717: Line 717:


=={{header|FreeBASIC}}==
=={{header|FreeBASIC}}==
<lang freebasic>' FB 1.05.0 Win64
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64


Sub proc()
Sub proc()
Line 733: Line 733:
Print
Print
Print "Press any key to quit"
Print "Press any key to quit"
Sleep</lang>
Sleep</syntaxhighlight>


{{out}}
{{out}}
Line 746: Line 746:
=={{header|Gambas}}==
=={{header|Gambas}}==
Note: Gambas (3.14.0) cannot perform this task as specified, as it does not have delegates, and pointers do not seem to work with procedures. What does work is using Object.Call, which is intended for executing procedures from external libraries. However the accepting procedure must refer to the object containing the procedure, and refer to the procedure by a String name. In this case, the current module/class reference (Me) is used, but the String name must be passed. This arrangement will only work within the same module/class. It may be possible to pass the parent reference to a method (taking 3 parameters) in another class if the named procedure is Public. The empty array ([]) in Object.Call represent a procedure without parameters, which are not an explicit requirement for this Task, but might require another parameter to the accepting procedure.
Note: Gambas (3.14.0) cannot perform this task as specified, as it does not have delegates, and pointers do not seem to work with procedures. What does work is using Object.Call, which is intended for executing procedures from external libraries. However the accepting procedure must refer to the object containing the procedure, and refer to the procedure by a String name. In this case, the current module/class reference (Me) is used, but the String name must be passed. This arrangement will only work within the same module/class. It may be possible to pass the parent reference to a method (taking 3 parameters) in another class if the named procedure is Public. The empty array ([]) in Object.Call represent a procedure without parameters, which are not an explicit requirement for this Task, but might require another parameter to the accepting procedure.
<lang gambas>
<syntaxhighlight lang="gambas">
Public Sub Main()
Public Sub Main()


Line 774: Line 774:
Print "RepeatableTwo"
Print "RepeatableTwo"


End</lang>
End</syntaxhighlight>
Output:
Output:
<pre>
<pre>
Line 785: Line 785:


=={{header|Go}}==
=={{header|Go}}==
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 801: Line 801:
func main() {
func main() {
repeat(4, fn)
repeat(4, fn)
}</lang>
}</syntaxhighlight>


=={{header|Haskell}}==
=={{header|Haskell}}==
Such a function already exists
Such a function already exists
<lang Haskell>import Control.Monad (replicateM_)
<syntaxhighlight lang="haskell">import Control.Monad (replicateM_)


sampleFunction :: IO ()
sampleFunction :: IO ()
sampleFunction = putStrLn "a"
sampleFunction = putStrLn "a"


main = replicateM_ 5 sampleFunction</lang>
main = replicateM_ 5 sampleFunction</syntaxhighlight>


And if the requirement is for something like a Church numeral, compounding the application of a given function '''n''' times (rather than repeating the same IO event '''n''' times) then we could also write something like '''applyN''' below:
And if the requirement is for something like a Church numeral, compounding the application of a given function '''n''' times (rather than repeating the same IO event '''n''' times) then we could also write something like '''applyN''' below:
<lang Haskell>applyN :: Int -> (a -> a) -> a -> a
<syntaxhighlight lang="haskell">applyN :: Int -> (a -> a) -> a -> a
applyN n f = foldr (.) id (replicate n f)
applyN n f = foldr (.) id (replicate n f)


main :: IO ()
main :: IO ()
main = print $ applyN 10 (\x -> 2 * x) 1</lang>
main = print $ applyN 10 (\x -> 2 * x) 1</syntaxhighlight>
{{Out}}
{{Out}}
<pre>1024</pre>
<pre>1024</pre>
Line 823: Line 823:
=={{header|Isabelle}}==
=={{header|Isabelle}}==
Isabelle does not have procedures with side effects. So we cannot do things such as printing a string to stdout. Isabelle only has pure mathematical functions.
Isabelle does not have procedures with side effects. So we cannot do things such as printing a string to stdout. Isabelle only has pure mathematical functions.
<lang Isabelle>theory Scratch
<syntaxhighlight lang="isabelle">theory Scratch
imports Main
imports Main
begin
begin
Line 877: Line 877:
lemma "fun_repeat (λ_. a) n = repeat a n" by(induction n) simp+
lemma "fun_repeat (λ_. a) n = repeat a n" by(induction n) simp+


end</lang>
end</syntaxhighlight>


=={{header|J}}==
=={{header|J}}==
<syntaxhighlight lang="j">
<lang J>
NB. ^: (J's power conjunction) repeatedly evaluates a verb.
NB. ^: (J's power conjunction) repeatedly evaluates a verb.


Line 934: Line 934:
hi
hi
hi
hi
</syntaxhighlight>
</lang>


=={{header|Java}}==
=={{header|Java}}==
{{works with|Java|8}}
{{works with|Java|8}}
<lang java>import java.util.function.Consumer;
<syntaxhighlight lang="java">import java.util.function.Consumer;
import java.util.stream.IntStream;
import java.util.stream.IntStream;


Line 950: Line 950:
IntStream.range(0, n).forEach(i -> fun.accept(i + 1));
IntStream.range(0, n).forEach(i -> fun.accept(i + 1));
}
}
}</lang>
}</syntaxhighlight>


Output:
Output:
Line 972: Line 972:


'''Unoptimized version''':
'''Unoptimized version''':
<lang jq>def unoptimized_repeat(f; n):
<syntaxhighlight lang="jq">def unoptimized_repeat(f; n):
if n <= 0 then empty
if n <= 0 then empty
else f, repeat(f; n-1)
else f, repeat(f; n-1)
end;</lang>
end;</syntaxhighlight>


'''Optimized for TCO''':
'''Optimized for TCO''':
<lang jq>def repeat(f; n):
<syntaxhighlight lang="jq">def repeat(f; n):
# state: [count, in]
# state: [count, in]
def r:
def r:
if .[0] >= n then empty else (.[1] | f), (.[0] += 1 | r) end;
if .[0] >= n then empty else (.[1] | f), (.[0] += 1 | r) end;
[0, .] | r;</lang>
[0, .] | r;</syntaxhighlight>
'''Variant''':
'''Variant''':
<lang jq># If n is a non-negative integer,
<syntaxhighlight lang="jq"># If n is a non-negative integer,
# then emit a stream of (n + 1) terms: ., f, f|f, f|f|f, ...
# then emit a stream of (n + 1) terms: ., f, f|f, f|f|f, ...
def repeatedly(f; n):
def repeatedly(f; n):
Line 992: Line 992:
else .[1], ([.[0] - 1, (.[1] | f)] | r)
else .[1], ([.[0] - 1, (.[1] | f)] | r)
end;
end;
[n, .] | r;</lang>
[n, .] | r;</syntaxhighlight>


'''Examples''':
'''Examples''':
<lang jq>0 | [ repeat(.+1; 3) ]</lang>
<syntaxhighlight lang="jq">0 | [ repeat(.+1; 3) ]</syntaxhighlight>
produces:
produces:
[1,1,1]
[1,1,1]
<lang jq>0 | repeatedly(.+1; 3)</lang>
<syntaxhighlight lang="jq">0 | repeatedly(.+1; 3)</syntaxhighlight>
produces:
produces:
0
0
Line 1,006: Line 1,006:


=={{header|Julia}}==
=={{header|Julia}}==
<lang julia>function sayHi()
<syntaxhighlight lang="julia">function sayHi()
println("Hi")
println("Hi")
end
end
Line 1,014: Line 1,014:
end
end


rep(sayHi, 3)</lang>
rep(sayHi, 3)</syntaxhighlight>
{{out}}
{{out}}
<pre>Hi
<pre>Hi
Line 1,021: Line 1,021:


=={{header|Kotlin}}==
=={{header|Kotlin}}==
<lang scala>// version 1.0.6
<syntaxhighlight lang="scala">// version 1.0.6


fun repeat(n: Int, f: () -> Unit) {
fun repeat(n: Int, f: () -> Unit) {
Line 1,032: Line 1,032:
fun main(args: Array<String>) {
fun main(args: Array<String>) {
repeat(5) { print("Example ") }
repeat(5) { print("Example ") }
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,047: Line 1,047:
It runs on Lean 3.4.2:
It runs on Lean 3.4.2:


<lang Lean>def repeat : ℕ → (ℕ → string) → string
<syntaxhighlight lang="lean">def repeat : ℕ → (ℕ → string) → string
| 0 f := "done"
| 0 f := "done"
| (n + 1) f := (f n) ++ (repeat n f)
| (n + 1) f := (f n) ++ (repeat n f)
Line 1,053: Line 1,053:


#eval repeat 5 $ λ b : ℕ , "me "
#eval repeat 5 $ λ b : ℕ , "me "
</syntaxhighlight>
</lang>


=={{header|LiveCode}}==
=={{header|LiveCode}}==
<lang LiveCode>rep "answer",3
<syntaxhighlight lang="livecode">rep "answer",3


command rep x,n
command rep x,n
Line 1,062: Line 1,062:
do merge("[[x]] [[n]]")
do merge("[[x]] [[n]]")
end repeat
end repeat
end rep</lang>
end rep</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==
No particular magic required as Lua allows functions to be passed as arguments.
No particular magic required as Lua allows functions to be passed as arguments.
<lang Lua>function myFunc ()
<syntaxhighlight lang="lua">function myFunc ()
print("Sure looks like a function in here...")
print("Sure looks like a function in here...")
end
end
Line 1,077: Line 1,077:


rep(myFunc, 4)
rep(myFunc, 4)
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>Sure looks like a function in here...
<pre>Sure looks like a function in here...
Line 1,086: Line 1,086:
=={{header|Mathematica}}/{{header|Wolfram Language}}==
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Note that anything of this form is not considered good practice.
Note that anything of this form is not considered good practice.
<lang Mathematica>repeat[f_, n_] := Do[f[], {n}];
<syntaxhighlight lang="mathematica">repeat[f_, n_] := Do[f[], {n}];
repeat[Print["Hello, world!"] &, 5];</lang>
repeat[Print["Hello, world!"] &, 5];</syntaxhighlight>
{{out}}
{{out}}
<pre>Hello, world!
<pre>Hello, world!
Line 1,098: Line 1,098:
This operator already exists in min and is called <code>times</code>.
This operator already exists in min and is called <code>times</code>.
{{works with|min|0.19.6}}
{{works with|min|0.19.6}}
<lang min>("Hello" puts!) 3 times</lang>
<syntaxhighlight lang="min">("Hello" puts!) 3 times</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,108: Line 1,108:
=={{header|MiniScript}}==
=={{header|MiniScript}}==


<lang MiniScript>sayHi = function()
<syntaxhighlight lang="miniscript">sayHi = function()
print "Hi!"
print "Hi!"
end function
end function
Line 1,118: Line 1,118:
end function
end function


rep @sayHi, 3</lang>
rep @sayHi, 3</syntaxhighlight>
{{out}}
{{out}}
<pre>Hi!
<pre>Hi!
Line 1,126: Line 1,126:
=={{header|МК-61/52}}==
=={{header|МК-61/52}}==


<lang>1 П4
<syntaxhighlight lang="text">1 П4


3 ^ 1 6 ПП 09 С/П
3 ^ 1 6 ПП 09 С/П
Line 1,132: Line 1,132:
П7 <-> П0 КПП7 L0 12 В/О
П7 <-> П0 КПП7 L0 12 В/О


ИП4 С/П КИП4 В/О</lang>
ИП4 С/П КИП4 В/О</syntaxhighlight>


=={{header|Modula-2}}==
=={{header|Modula-2}}==
<lang modula2>MODULE Repeat;
<syntaxhighlight lang="modula2">MODULE Repeat;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;


Line 1,158: Line 1,158:


ReadChar
ReadChar
END Repeat.</lang>
END Repeat.</syntaxhighlight>


=={{header|Nanoquery}}==
=={{header|Nanoquery}}==
{{trans|Python}}
{{trans|Python}}
<lang Nanoquery>def repeat(f,n)
<syntaxhighlight lang="nanoquery">def repeat(f,n)
for i in range(1, n)
for i in range(1, n)
f()
f()
Line 1,172: Line 1,172:
end
end


repeat(procedure, 3)</lang>
repeat(procedure, 3)</syntaxhighlight>


=={{header|Nim}}==
=={{header|Nim}}==
<lang nim>proc example =
<syntaxhighlight lang="nim">proc example =
echo "Example"
echo "Example"


Line 1,209: Line 1,209:
repeatMacro 4:
repeatMacro 4:
example()
example()
</syntaxhighlight>
</lang>


=={{header|Objeck}}==
=={{header|Objeck}}==


<lang objeck>class Repeat {
<syntaxhighlight lang="objeck">class Repeat {
function : Main(args : String[]) ~ Nil {
function : Main(args : String[]) ~ Nil {
Repeat(Example() ~ Nil, 3);
Repeat(Example() ~ Nil, 3);
Line 1,227: Line 1,227:
"Example"->PrintLine();
"Example"->PrintLine();
}
}
}</lang>
}</syntaxhighlight>


=={{header|OCaml}}==
=={{header|OCaml}}==


<lang ocaml>let repeat ~f ~n =
<syntaxhighlight lang="ocaml">let repeat ~f ~n =
for i = 1 to n do
for i = 1 to n do
f ()
f ()
Line 1,241: Line 1,241:
let () =
let () =
repeat ~n:4 ~f:func
repeat ~n:4 ~f:func
</syntaxhighlight>
</lang>


=={{header|Oforth}}==
=={{header|Oforth}}==
Line 1,247: Line 1,247:
This method is already defined : times. This method can be used on all runnables (functions, methods, blocks, ...).
This method is already defined : times. This method can be used on all runnables (functions, methods, blocks, ...).


<lang Oforth>: hello "Hello, World!" println ;
<syntaxhighlight lang="oforth">: hello "Hello, World!" println ;
10 #hello times</lang>
10 #hello times</syntaxhighlight>


{{out}}
{{out}}
Line 1,265: Line 1,265:


=={{header|Ol}}==
=={{header|Ol}}==
<lang scheme>
<syntaxhighlight lang="scheme">
; sample function
; sample function
(define (function) (display "+"))
(define (function) (display "+"))
Line 1,282: Line 1,282:
(print) ; print newline
(print) ; print newline
; ==> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ==> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
</syntaxhighlight>
</lang>


=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
<lang parigp>repeat(f, n)=for(i=1,n,f());
<syntaxhighlight lang="parigp">repeat(f, n)=for(i=1,n,f());
repeat( ()->print("Hi!"), 2);</lang>
repeat( ()->print("Hi!"), 2);</syntaxhighlight>
{{out}}
{{out}}
<pre>Hi!
<pre>Hi!
Hi!</pre>
Hi!</pre>
=={{header|Pascal}}==
=={{header|Pascal}}==
<lang pascal>program Repeater;
<syntaxhighlight lang="pascal">program Repeater;


type
type
Line 1,311: Line 1,311:
begin
begin
Iterate(P, 3);
Iterate(P, 3);
end. </lang>
end. </syntaxhighlight>
{{out}}
{{out}}
<pre>Iteration 1
<pre>Iteration 1
Line 1,321: Line 1,321:
{{trans|C}}
{{trans|C}}


<lang perl>sub repeat {
<syntaxhighlight lang="perl">sub repeat {
my ($sub, $n) = @_;
my ($sub, $n) = @_;
$sub->() for 1..$n;
$sub->() for 1..$n;
Line 1,330: Line 1,330:
}
}


repeat(\&example, 4);</lang>
repeat(\&example, 4);</syntaxhighlight>


=={{header|Phix}}==
=={{header|Phix}}==
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Repeat</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">rid</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Repeat</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">rid</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
Line 1,345: Line 1,345:
<span style="color: #000000;">Repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Hello</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">Repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Hello</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
<!--</lang>-->
<!--</syntaxhighlight>-->


=={{header|Phixmonti}}==
=={{header|Phixmonti}}==
<lang Phixmonti>def myFunc
<syntaxhighlight lang="phixmonti">def myFunc
"Sure looks like a function in here..." print nl
"Sure looks like a function in here..." print nl
enddef
enddef
Line 1,360: Line 1,360:


getid myFunc 4 rep
getid myFunc 4 rep
</syntaxhighlight>
</lang>


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==


<lang PicoLisp># The built-in function "do" can be used to achieve our goal,
<syntaxhighlight lang="picolisp"># The built-in function "do" can be used to achieve our goal,
# however, it has a slightly different syntax than what the
# however, it has a slightly different syntax than what the
# problem specifies.
# problem specifies.
Line 1,375: Line 1,375:
(do N (Fn)) )
(do N (Fn)) )


(dofn version 10)</lang>
(dofn version 10)</syntaxhighlight>


=={{header|PowerShell}}==
=={{header|PowerShell}}==
{{trans|Python}} (Made more PowerShelly.)
{{trans|Python}} (Made more PowerShelly.)
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Out-Example
function Out-Example
{
{
Line 1,394: Line 1,394:


Step-Function Out-Example -Repeat 3
Step-Function Out-Example -Repeat 3
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
Line 1,404: Line 1,404:
=={{header|Prolog}}==
=={{header|Prolog}}==


<lang prolog>repeat(_, 0).
<syntaxhighlight lang="prolog">repeat(_, 0).
repeat(Callable, Times) :-
repeat(Callable, Times) :-
succ(TimesLess1, Times),
succ(TimesLess1, Times),
Line 1,411: Line 1,411:


test :- write('Hello, World'), nl.
test :- write('Hello, World'), nl.
test(Name) :- format('Hello, ~w~n', Name).</lang>
test(Name) :- format('Hello, ~w~n', Name).</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,430: Line 1,430:


=={{header|PureBasic}}==
=={{header|PureBasic}}==
<lang PureBasic>Prototype.i fun(x.i)
<syntaxhighlight lang="purebasic">Prototype.i fun(x.i)


Procedure.i quark(z.i)
Procedure.i quark(z.i)
Line 1,440: Line 1,440:
EndProcedure
EndProcedure


rep(@quark(),3)</lang>
rep(@quark(),3)</syntaxhighlight>
{{out}}
{{out}}
<pre>Quark 3
<pre>Quark 3
Line 1,449: Line 1,449:


===Procedural===
===Procedural===
<lang Python>#!/usr/bin/python
<syntaxhighlight lang="python">#!/usr/bin/python
def repeat(f,n):
def repeat(f,n):
for i in range(n):
for i in range(n):
Line 1,457: Line 1,457:
print("Example");
print("Example");


repeat(procedure,3); #prints "Example" (without quotes) three times, separated by newlines.</lang>
repeat(procedure,3); #prints "Example" (without quotes) three times, separated by newlines.</syntaxhighlight>


===Functional===
===Functional===
Repeated function application:
Repeated function application:
{{Works with|Python|3.7}}
{{Works with|Python|3.7}}
<lang python>'''Application of a given function, repeated N times'''
<syntaxhighlight lang="python">'''Application of a given function, repeated N times'''


from itertools import repeat
from itertools import repeat
Line 1,560: Line 1,560:
# MAIN ---
# MAIN ---
if __name__ == '__main__':
if __name__ == '__main__':
main()</lang>
main()</syntaxhighlight>
{{Out}}
{{Out}}
<pre>Application of a given function, repeated N times:
<pre>Application of a given function, repeated N times:
Line 1,586: Line 1,586:
The word ''rosetta-times'' is also defined here, using ''times''. It takes both the repeat number and the function as stack arguments.
The word ''rosetta-times'' is also defined here, using ''times''. It takes both the repeat number and the function as stack arguments.


<lang Quackery> [ stack ] is times.start ( --> s )
<syntaxhighlight lang="quackery"> [ stack ] is times.start ( --> s )
protect times.start
protect times.start


Line 1,618: Line 1,618:


[ nested ' times nested
[ nested ' times nested
swap join do ] is rosetta-times ( n x --> )</lang>
swap join do ] is rosetta-times ( n x --> )</syntaxhighlight>


{{Out}}
{{Out}}
Line 1,634: Line 1,634:


=={{header|R}}==
=={{header|R}}==
<syntaxhighlight lang="r">
<lang R>
f1 <- function(...){print("coucou")}
f1 <- function(...){print("coucou")}


Line 1,642: Line 1,642:


f2(f1,4)
f2(f1,4)
</syntaxhighlight>
</lang>


=={{header|Racket}}==
=={{header|Racket}}==
The racket guide has a section called [http://docs.racket-lang.org/guide/for.html?q=iterators "Iterators and Comprehensions"], which shows that ''for'' isn't just for repeating n times!
The racket guide has a section called [http://docs.racket-lang.org/guide/for.html?q=iterators "Iterators and Comprehensions"], which shows that ''for'' isn't just for repeating n times!


<lang Racket>#lang racket/base
<syntaxhighlight lang="racket">#lang racket/base
(define (repeat f n) ; the for loop is idiomatic of (although not exclusive to) racket
(define (repeat f n) ; the for loop is idiomatic of (although not exclusive to) racket
(for ((_ n)) (f)))
(for ((_ n)) (f)))
Line 1,658: Line 1,658:
(display "...")
(display "...")
(repeat2 (λ () (display " & over")) 5)
(repeat2 (λ () (display " & over")) 5)
(newline)</lang>
(newline)</syntaxhighlight>
{{out}}
{{out}}
<pre>... and over and over and over and over and over... & over & over & over & over & over</pre>
<pre>... and over and over and over and over and over... & over & over & over & over & over</pre>
Line 1,665: Line 1,665:
(formerly Perl 6)
(formerly Perl 6)


<lang perl6>sub repeat (&f, $n) { f() xx $n };
<syntaxhighlight lang="raku" line>sub repeat (&f, $n) { f() xx $n };


sub example { say rand }
sub example { say rand }


repeat(&example, 3);</lang>
repeat(&example, 3);</syntaxhighlight>


{{Out}}
{{Out}}
Line 1,690: Line 1,690:


=={{header|Red}}==
=={{header|Red}}==
<lang rebol>Red[]
<syntaxhighlight lang="rebol">Red[]


myrepeat: function [fn n] [loop n [do fn]]
myrepeat: function [fn n] [loop n [do fn]]


myrepeat [print "hello"] 3</lang>
myrepeat [print "hello"] 3</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,705: Line 1,705:
The procedure name (that is being repeatedly executed) isn't restricted to an &nbsp; ''internal'' &nbsp; REXX subroutine (procedure),
The procedure name (that is being repeatedly executed) isn't restricted to an &nbsp; ''internal'' &nbsp; REXX subroutine (procedure),
<br>it may be an &nbsp; ''external'' &nbsp; program (procedure) written in any language.
<br>it may be an &nbsp; ''external'' &nbsp; program (procedure) written in any language.
<lang rexx>/*REXX program executes a named procedure a specified number of times. */
<syntaxhighlight lang="rexx">/*REXX program executes a named procedure a specified number of times. */
parse arg pN # . /*obtain optional arguments from the CL*/
parse arg pN # . /*obtain optional arguments from the CL*/
if #=='' | #=="," then #= 1 /*assume once if not specified. */
if #=='' | #=="," then #= 1 /*assume once if not specified. */
Line 1,715: Line 1,715:
return /*return to invoker of the REPEATS proc*/
return /*return to invoker of the REPEATS proc*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
yabba: say 'Yabba, yabba do!'; return /*simple code; no need for PROCEDURE.*/</lang>
yabba: say 'Yabba, yabba do!'; return /*simple code; no need for PROCEDURE.*/</syntaxhighlight>
{{out|output|text=&nbsp; when using the input of: &nbsp; &nbsp; <tt> yabba &nbsp; 4 </tt>}}
{{out|output|text=&nbsp; when using the input of: &nbsp; &nbsp; <tt> yabba &nbsp; 4 </tt>}}
<pre>
<pre>
Line 1,733: Line 1,733:


=={{header|Ring}}==
=={{header|Ring}}==
<lang ring>
<syntaxhighlight lang="ring">
Func Main
Func Main
times(5,:test)
times(5,:test)
Line 1,744: Line 1,744:
Call F()
Call F()
next
next
</syntaxhighlight>
</lang>


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang ruby>4.times{ puts "Example" } # idiomatic way
<syntaxhighlight lang="ruby">4.times{ puts "Example" } # idiomatic way


def repeat(proc,num)
def repeat(proc,num)
Line 1,753: Line 1,753:
end
end


repeat(->{ puts "Example" }, 4)</lang>
repeat(->{ puts "Example" }, 4)</syntaxhighlight>


=={{header|Rust}}==
=={{header|Rust}}==
Line 1,759: Line 1,759:
Rust has higher-order functions.
Rust has higher-order functions.


<lang rust>fn repeat(f: impl FnMut(usize), n: usize) {
<syntaxhighlight lang="rust">fn repeat(f: impl FnMut(usize), n: usize) {
(0..n).for_each(f);
(0..n).for_each(f);
}</lang>
}</syntaxhighlight>


Here we define the function <code>repeat</code> which takes the function <code>Fn(usize)</code>, which is an anonymous trait constraint by the <code>impl Trait</code> syntax, in such a way that it's size can be known statically at compile time. The range iterator <code>0..n</code> is used, in combination with the <code>Iterator::for_each</code> method to consume it.
Here we define the function <code>repeat</code> which takes the function <code>Fn(usize)</code>, which is an anonymous trait constraint by the <code>impl Trait</code> syntax, in such a way that it's size can be known statically at compile time. The range iterator <code>0..n</code> is used, in combination with the <code>Iterator::for_each</code> method to consume it.
Line 1,769: Line 1,769:
It's idiomatic to use a closure.
It's idiomatic to use a closure.


<lang rust>fn main() {
<syntaxhighlight lang="rust">fn main() {
repeat(|x| print!("{};", x), 5);
repeat(|x| print!("{};", x), 5);
}</lang>
}</syntaxhighlight>
{{out}}<pre>0;1;2;3;4;</pre>
{{out}}<pre>0;1;2;3;4;</pre>


Line 1,778: Line 1,778:
Also possible to define a static function.
Also possible to define a static function.


<lang rust>fn function(x: usize) {
<syntaxhighlight lang="rust">fn function(x: usize) {
print!("{};", x);
print!("{};", x);
}
}
Line 1,784: Line 1,784:
fn main() {
fn main() {
repeat(function, 4);
repeat(function, 4);
}</lang>
}</syntaxhighlight>


{{out}}<pre>0;1;2;3;</pre>
{{out}}<pre>0;1;2;3;</pre>
Line 1,792: Line 1,792:
Sometimes it may be convenient to call a static method.
Sometimes it may be convenient to call a static method.


<lang rust>struct Foo;
<syntaxhighlight lang="rust">struct Foo;
impl Foo {
impl Foo {
fn associated(x: usize) {
fn associated(x: usize) {
Line 1,801: Line 1,801:
fn main() {
fn main() {
repeat(Foo::associated, 8);
repeat(Foo::associated, 8);
}</lang>
}</syntaxhighlight>
{{out}}<pre>0;1;2;3;4;5;6;7;</pre>
{{out}}<pre>0;1;2;3;4;5;6;7;</pre>


Line 1,808: Line 1,808:
You can also use implemented trait-methods as a function-argument. This works because the implemented type is <code>usize</code> which is what the iterator supplied to <code>Fn(usize)</code>.
You can also use implemented trait-methods as a function-argument. This works because the implemented type is <code>usize</code> which is what the iterator supplied to <code>Fn(usize)</code>.


<lang rust>trait Bar {
<syntaxhighlight lang="rust">trait Bar {
fn run(self);
fn run(self);
}
}
Line 1,820: Line 1,820:
fn main() {
fn main() {
repeat(Bar::run, 6);
repeat(Bar::run, 6);
}</lang>
}</syntaxhighlight>
{{out}}<pre>0;1;2;3;4;5;</pre>
{{out}}<pre>0;1;2;3;4;5;</pre>


Line 1,827: Line 1,827:
The most interesting application would probably be a mutable closure, which requires changing the type signature from <code>Fn</code> to <code>FnMut</code>, because they are constrained by slightly different rules, but otherwise work the same.
The most interesting application would probably be a mutable closure, which requires changing the type signature from <code>Fn</code> to <code>FnMut</code>, because they are constrained by slightly different rules, but otherwise work the same.


<lang rust>fn repeat(f: impl FnMut(usize), n: usize) {
<syntaxhighlight lang="rust">fn repeat(f: impl FnMut(usize), n: usize) {
(0..n).for_each(f);
(0..n).for_each(f);
}
}
Line 1,837: Line 1,837:
mult += x;
mult += x;
}, 5);
}, 5);
}</lang>
}</syntaxhighlight>
{{out}}<pre>0;1;4;12;28;</pre>
{{out}}<pre>0;1;4;12;28;</pre>


Line 1,845: Line 1,845:
# Type parameterization
# Type parameterization
# Higher order function
# Higher order function
<lang scala> def repeat[A](n:Int)(f: => A)= ( 0 until n).foreach(_ => f)
<syntaxhighlight lang="scala"> def repeat[A](n:Int)(f: => A)= ( 0 until n).foreach(_ => f)


repeat(3) { println("Example") }</lang>
repeat(3) { println("Example") }</syntaxhighlight>
===Advanced Scala-ish ===
===Advanced Scala-ish ===
# Call by name
# Call by name
Line 1,854: Line 1,854:
# Tail recursion
# Tail recursion
# Infix notation
# Infix notation
<lang scala>object Repeat2 extends App {
<syntaxhighlight lang="scala">object Repeat2 extends App {
implicit class IntWithTimes(x: Int) {
implicit class IntWithTimes(x: Int) {
Line 1,869: Line 1,869:


5 times println("ha") // Not recommended infix for 5.times(println("ha")) aka dot notation
5 times println("ha") // Not recommended infix for 5.times(println("ha")) aka dot notation
}</lang>
}</syntaxhighlight>


===Most Scala-ish ===
===Most Scala-ish ===
Line 1,878: Line 1,878:
# Infix notation
# Infix notation
# Operator overloading
# Operator overloading
<lang scala>import scala.annotation.tailrec
<syntaxhighlight lang="scala">import scala.annotation.tailrec


object Repeat3 extends App {
object Repeat3 extends App {
Line 1,895: Line 1,895:


print("ha") * 5 // * is the method, effective should be A.*(5)
print("ha") * 5 // * is the method, effective should be A.*(5)
}</lang>
}</syntaxhighlight>


=={{header|Scheme}}==
=={{header|Scheme}}==
Line 1,902: Line 1,902:
an unspecified value. The actual value returned varies depending on the Scheme implementation itself.
an unspecified value. The actual value returned varies depending on the Scheme implementation itself.


<lang scheme>
<syntaxhighlight lang="scheme">
(import (scheme base)
(import (scheme base)
(scheme write))
(scheme write))
Line 1,916: Line 1,916:
;; example returning a number
;; example returning a number
(display (repeat (lambda () (+ 1 2)) 5)) (newline)
(display (repeat (lambda () (+ 1 2)) 5)) (newline)
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 1,931: Line 1,931:


=={{header|Seed7}}==
=={{header|Seed7}}==
<lang seed7>$ include "seed7_05.s7i";
<syntaxhighlight lang="seed7">$ include "seed7_05.s7i";


const proc: myRepeat (in integer: times, in proc: aProcedure) is func
const proc: myRepeat (in integer: times, in proc: aProcedure) is func
Line 1,945: Line 1,945:
begin
begin
myRepeat(3, writeln("Hello!"));
myRepeat(3, writeln("Hello!"));
end func;</lang>
end func;</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,954: Line 1,954:


=={{header|Sidef}}==
=={{header|Sidef}}==
<lang ruby>func repeat(f, n) {
<syntaxhighlight lang="ruby">func repeat(f, n) {
{ f() } * n;
{ f() } * n;
}
}
Line 1,962: Line 1,962:
}
}


repeat(example, 4);</lang>
repeat(example, 4);</syntaxhighlight>


=={{header|Standard ML}}==
=={{header|Standard ML}}==
<lang sml>fun repeat (_, 0) = ()
<syntaxhighlight lang="sml">fun repeat (_, 0) = ()
| repeat (f, n) = (f (); repeat (f, n - 1))
| repeat (f, n) = (f (); repeat (f, n - 1))


Line 1,971: Line 1,971:
print "test\n"
print "test\n"


val () = repeat (testProcedure, 5)</lang>
val () = repeat (testProcedure, 5)</syntaxhighlight>


=={{header|Stata}}==
=={{header|Stata}}==


<lang stata>function repeat(f,n) {
<syntaxhighlight lang="stata">function repeat(f,n) {
for (i=1; i<=n; i++) (*f)()
for (i=1; i<=n; i++) (*f)()
}
}
Line 1,983: Line 1,983:
}
}


repeat(&hello(),3)</lang>
repeat(&hello(),3)</syntaxhighlight>


=={{header|Swift}}==
=={{header|Swift}}==
<lang swift>func repeat(n: Int, f: () -> ()) {
<syntaxhighlight lang="swift">func repeat(n: Int, f: () -> ()) {
for _ in 0..<n {
for _ in 0..<n {
f()
f()
Line 1,992: Line 1,992:
}
}


repeat(4) { println("Example") }</lang>
repeat(4) { println("Example") }</syntaxhighlight>


=={{header|Tcl}}==
=={{header|Tcl}}==
The usual way of doing a repeat would be:
The usual way of doing a repeat would be:
<lang tcl>proc repeat {command count} {
<syntaxhighlight lang="tcl">proc repeat {command count} {
for {set i 0} {$i < $count} {incr i} {
for {set i 0} {$i < $count} {incr i} {
uplevel 1 $command
uplevel 1 $command
Line 2,003: Line 2,003:


proc example {} {puts "This is an example"}
proc example {} {puts "This is an example"}
repeat example 4</lang>
repeat example 4</syntaxhighlight>
However, the <code>time</code> command can be used as long as the return value (the report on the timing information) is ignored.
However, the <code>time</code> command can be used as long as the return value (the report on the timing information) is ignored.
<lang tcl>time example 4</lang>
<syntaxhighlight lang="tcl">time example 4</syntaxhighlight>
It should be noted that the “command” can be an arbitrary script, not just a call to a procedure:
It should be noted that the “command” can be an arbitrary script, not just a call to a procedure:
<lang tcl>repeat {puts "hello world"} 3</lang>
<syntaxhighlight lang="tcl">repeat {puts "hello world"} 3</syntaxhighlight>


=={{header|uBasic/4tH}}==
=={{header|uBasic/4tH}}==
<lang>Proc _Repeat (_HelloWorld, 5) : End
<syntaxhighlight lang="text">Proc _Repeat (_HelloWorld, 5) : End


_Repeat Param (2) : Local (1) : For c@ = 1 To b@ : Proc a@ : Next : Return
_Repeat Param (2) : Local (1) : For c@ = 1 To b@ : Proc a@ : Next : Return
_HelloWorld Print "Hello world!" : Return</lang>
_HelloWorld Print "Hello world!" : Return</syntaxhighlight>
Output:
Output:
<pre>
<pre>
Line 2,026: Line 2,026:


=={{header|Ursa}}==
=={{header|Ursa}}==
<lang ursa>def repeat (function f, int n)
<syntaxhighlight lang="ursa">def repeat (function f, int n)
for (set n n) (> n 0) (dec n)
for (set n n) (> n 0) (dec n)
f
f
Line 2,037: Line 2,037:


# outputs "Hello! " 5 times
# outputs "Hello! " 5 times
repeat procedure 5</lang>
repeat procedure 5</syntaxhighlight>


=={{header|VBA}}==
=={{header|VBA}}==
{{trans|Phix}}<lang vb>Private Sub Repeat(rid As String, n As Integer)
{{trans|Phix}}<syntaxhighlight lang="vb">Private Sub Repeat(rid As String, n As Integer)
For i = 1 To n
For i = 1 To n
Application.Run rid
Application.Run rid
Line 2,052: Line 2,052:
Public Sub main()
Public Sub main()
Repeat "Hello", 5
Repeat "Hello", 5
End Sub</lang>
End Sub</syntaxhighlight>


=={{header|Verilog}}==
=={{header|Verilog}}==
<lang Verilog>module main;
<syntaxhighlight lang="verilog">module main;
initial begin
initial begin
repeat(5) begin
repeat(5) begin
Line 2,062: Line 2,062:
$display("Loop Ended");
$display("Loop Ended");
end
end
endmodule</lang>
endmodule</syntaxhighlight>
{{out}}
{{out}}
<pre>Inside loop
<pre>Inside loop
Line 2,073: Line 2,073:
=={{header|Visual Basic .NET}}==
=={{header|Visual Basic .NET}}==
{{trans|C#}}
{{trans|C#}}
<lang vbnet>Module Module1
<syntaxhighlight lang="vbnet">Module Module1


Sub Repeat(count As Integer, fn As Action(Of Integer))
Sub Repeat(count As Integer, fn As Action(Of Integer))
Line 2,089: Line 2,089:
End Sub
End Sub


End Module</lang>
End Module</syntaxhighlight>
{{out}}
{{out}}
<pre>Example 1
<pre>Example 1
Line 2,096: Line 2,096:


=={{header|Vlang}}==
=={{header|Vlang}}==
<lang vlang>fn repeat(n int, f fn()) {
<syntaxhighlight lang="vlang">fn repeat(n int, f fn()) {
for _ in 0.. n {
for _ in 0.. n {
f()
f()
Line 2,108: Line 2,108:
fn main() {
fn main() {
repeat(4, func)
repeat(4, func)
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>Example
<pre>Example
Line 2,117: Line 2,117:


=={{header|Wren}}==
=={{header|Wren}}==
<lang ecmascript>var f = Fn.new { |g, n|
<syntaxhighlight lang="ecmascript">var f = Fn.new { |g, n|
for (i in 1..n) g.call(n)
for (i in 1..n) g.call(n)
}
}
Line 2,126: Line 2,126:
}
}


f.call(g, 5)</lang>
f.call(g, 5)</syntaxhighlight>


{{out}}
{{out}}
Line 2,139: Line 2,139:
=={{header|XBS}}==
=={{header|XBS}}==
XBS has a built-in repeat keyword.
XBS has a built-in repeat keyword.
<lang xbs>func rep(callback:function,amount:number,*args:array=[]):null{
<syntaxhighlight lang="xbs">func rep(callback:function,amount:number,*args:array=[]):null{
repeat amount {
repeat amount {
callback(*args);
callback(*args);
Line 2,147: Line 2,147:
rep(func(a,b,c){
rep(func(a,b,c){
log(a+b+c);
log(a+b+c);
},3,1,2,3);</lang>
},3,1,2,3);</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,156: Line 2,156:


=={{header|XLISP}}==
=={{header|XLISP}}==
<lang lisp>(defun repeat (f n)
<syntaxhighlight lang="lisp">(defun repeat (f n)
(f)
(f)
(if (> n 1)
(if (> n 1)
Line 2,162: Line 2,162:


;; an example to test it:
;; an example to test it:
(repeat (lambda () (print '(hello rosetta code))) 5)</lang>
(repeat (lambda () (print '(hello rosetta code))) 5)</syntaxhighlight>
{{out}}
{{out}}
<pre>(HELLO ROSETTA CODE)
<pre>(HELLO ROSETTA CODE)
Line 2,172: Line 2,172:
=={{header|Yabasic}}==
=={{header|Yabasic}}==
{{trans|Lua}}
{{trans|Lua}}
<lang Yabasic>sub myFunc ()
<syntaxhighlight lang="yabasic">sub myFunc ()
print "Sure looks like a function in here..."
print "Sure looks like a function in here..."
end sub
end sub
Line 2,182: Line 2,182:
end sub
end sub
rep("myFunc", 4)</lang>
rep("myFunc", 4)</syntaxhighlight>
=={{header|Z80 Assembly}}==
=={{header|Z80 Assembly}}==


Line 2,188: Line 2,188:
This technique is called the "Return Trick", it's efficient but makes the program more difficult to read. It works on the principle that the processor's RET command assumes the return address is the top item of the stack. The programmer can abuse this to "return" to a section of code that has never actually been executed. This is essentially just another form of the computed goto. Most processors that use the stack to store return addresses can use this technique, though the method of doing it depends on the processor itself.
This technique is called the "Return Trick", it's efficient but makes the program more difficult to read. It works on the principle that the processor's RET command assumes the return address is the top item of the stack. The programmer can abuse this to "return" to a section of code that has never actually been executed. This is essentially just another form of the computed goto. Most processors that use the stack to store return addresses can use this technique, though the method of doing it depends on the processor itself.


<lang z80>
<syntaxhighlight lang="z80">
ld b,&05 ;load the decrement value into b
ld b,&05 ;load the decrement value into b
ld hl,myFunc ;load the address of "myFunc" into HL
ld hl,myFunc ;load the address of "myFunc" into HL
Line 2,215: Line 2,215:
pop hl
pop hl
ret
ret
</syntaxhighlight>
</lang>
=== Indirect Jump ===
=== Indirect Jump ===


Same as above but uses an indirect jump to the address in HL.
Same as above but uses an indirect jump to the address in HL.
<lang z80>trampoline:
<syntaxhighlight lang="z80">trampoline:
jp (hl) ;despite the parentheses this does NOT dereference HL, it merely acts as "LD PC,HL".</lang>
jp (hl) ;despite the parentheses this does NOT dereference HL, it merely acts as "LD PC,HL".</syntaxhighlight>


===Using self-modifying code===
===Using self-modifying code===
Line 2,234: Line 2,234:
call &0000 ;gets overwritten with the address of MyFunc
call &0000 ;gets overwritten with the address of MyFunc
djnz repeatProc
djnz repeatProc
ret</lang>
ret</syntaxhighlight>


=={{header|zkl}}==
=={{header|zkl}}==
<lang zkl>fcn repeat(f,n){ do(n){ f() } }
<syntaxhighlight lang="zkl">fcn repeat(f,n){ do(n){ f() } }
repeat("ho ".print,3);</lang>
repeat("ho ".print,3);</syntaxhighlight>
{{out}}<pre>ho ho ho </pre>
{{out}}<pre>ho ho ho </pre>

Revision as of 12:31, 28 August 2022

Task
Repeat
You are encouraged to solve this task according to the task description, using any language you may know.
Task

Write a procedure which accepts as arguments another procedure and a positive integer.

The latter procedure is executed a number of times equal to the accepted integer.

11l

Translation of: Python
F repeat(f, n)
   L 1..n
      f()

F procedure()
   print(‘Example’)

repeat(procedure, 3)
Output:
Example
Example
Example

6502 Assembly

Using a trampoline

This routine is a bit messy, and assumes the called routine doesn't clobber the zero-page memory used to maintain it. This can be modified to push/pop those values before/after the routine is executed.

macro RepeatProc,addr,count ;VASM macro syntax
; input: 
; addr = the label of the routine you wish to call repeatedly
; count = how many times you want to DO the procedure. 1 = once, 2 = twice, 3 = three times, etc. Enter "0" for 256 times.
lda #<\addr
sta z_L ;a label for a zero-page memory address
lda #>\addr
sta z_H ;a label for the zero-page memory address immediately after z_L
lda \count
jsr doRepeatProc
endm

doRepeatProc:
sta z_C   ;another zero-page memory location
loop_RepeatProc:
jsr Trampoline_RepeatProc
dec z_C
lda z_C
bne loop_RepeatProc
rts

Trampoline_RepeatProc:
db $6c,z_L,$00 
;when executed, becomes an indirect JMP to the address stored at z_L and z_H. Some assemblers will let you type
;JMP (z_L) and it will automatically replace it with the above during the assembly process.
;This causes an indirect JMP to the routine. Its RTS will return execution to just after the "JSR Trampoline_RepeatProc" 
;and flow into the loop overhead.

Once the macro and the underlying subroutine are created, this is very simple to use:

RepeatProc foo,#20 ;perform the subroutine "foo" twenty times.

Using self-modifying code

This version requires that your "wrapper" executes in RAM, so that it can be modified. For this to work, it is assumed that the routine you're using doesn't clobber Y, or require that its parameters are passed in by A or X (so admittedly this method is a bit limited, but if you use the zero page to hold the parameters you can set them up prior to calling the wrapper itself.

RepeatProc:
;input: low byte of desired function address in A
;       high byte of desired function address in X
;       repeat count in Y

STA smc_repeatproc+1
STX smc_repeatproc+2
smc_repeatproc:
jsr $0000  ;this is modified by the STA and STX above.
dey        
bne smc_repeatproc
rts

68000 Assembly

This example code prints an exclamation point to the screen 4 times. It is assumed that the functions called do not clobber A5 or D7, as doing so would cause undefined behavior (read: a crash or a program counter "escape.")

	lea foo,a5            ;function to execute
	move.w #4-1,d7        ;times to repeat
	jsr Repeater
	
	jmp *                 ;halt the CPU, we're done
	
repeater:
	jsr repeaterhelper    ;this also need to be a call, so that the RTS of the desired procedure
                              ;returns us to the loop rather than the line after "jsr Repeater".
	DBRA D7,repeater
	rts
	
repeaterhelper:
	jmp (a5)       ;keep in mind, this is NOT a dereference, it simply sets the program counter equal to A5.
                       ;A bit misleading if you ask me.
foo:
	MOVE.B #'!',D0
	JSR PrintChar
	rts
Output:
!!!!

Action!

DEFINE PTR="CARD"

PROC OutputText(CHAR ARRAY s)
  PrintE(s)
RETURN

PROC Procedure=*(CHAR ARRAY s)
  DEFINE JSR="$20"
  DEFINE RTS="$60"
  [JSR $00 $00 ;JSR to address set by SetProcedure
   RTS]

PROC SetProcedure(PTR p)
  PTR addr

  addr=Procedure+1 ;location of address of JSR
  PokeC(addr,p)
RETURN

PROC Repeat(PTR procFun CHAR ARRAY s BYTE n)
  BYTE i

  SetProcedure(procFun)
  FOR i=1 TO n
  DO
    Procedure(s)
  OD
RETURN

PROC Main()
  Repeat(OutputText,"Action!",5)
RETURN
Output:

Screenshot from Atari 8-bit computer

Action!
Action!
Action!
Action!
Action!

Ada

with Ada.Text_IO;

procedure Repeat_Example is
   
   procedure Repeat(P: access Procedure; Reps: Natural) is
   begin
      for I in 1 .. Reps loop
	 P.all; -- P points to a procedure, and P.all actually calls that procedure
      end loop;
   end Repeat;
   
   procedure Hello is
   begin
      Ada.Text_IO.Put("Hello! ");
   end Hello;
   
begin
   Repeat(Hello'Access, 3); -- Hello'Access points to the procedure Hello
end Repeat_Example;

Output:

Hello! Hello! Hello! 

ALGOL 68

Works with: ALGOL 68G version Any - tested with release 2.8.win32
# operator that executes a procedure the specified number of times            #
OP REPEAT = ( INT count, PROC VOID routine )VOID:
    TO count DO routine OD;

# make REPEAT a low priority operater                                         #
PRIO REPEAT = 1;


# can also create variant that passes the iteration count as a parameter      #
OP REPEAT = ( INT count, PROC( INT )VOID routine )VOID:
    FOR iteration TO count DO routine( iteration ) OD;

main: (

    # PROC to test the REPEAT operator with                                   #
    PROC say something = VOID: print( ( "something", newline ) );

    3 REPEAT say something;

    # PROC to test the variant                                                #
    PROC show squares = ( INT n )VOID: print( ( n, n * n, newline ) );

    3 REPEAT show squares

)

Output:

something
something
something
         +1         +1
         +2         +4
         +3         +9

ALGOL W

As well as the names of procedures, Algol W allows statements to be passed as parameters where a procedure is expected.

begin
    % executes the procedure routine the specified number of times            %
    procedure repeat ( integer value count; procedure routine ) ;
        for i := 1 until count do routine;
    begin
        integer x;
        % print "hello" three times                                           %
        repeat( 3, write( "hello" ) );
        % print the first 10 squares                                          %
        write();
        x := 1;
        repeat( 10
              , begin
                    writeon( i_w := s_w := 1, x * x );
                    x := x + 1
                end
              )
    end
end.
Output:
hello
hello
hello
1 4 9 16 25 36 49 64 81 100

AppleScript

-- applyN :: Int -> (a -> a) -> a -> a
on applyN(n, f, x)
    script go
        on |λ|(a, g)
            |λ|(a) of mReturn(g)
        end |λ|
    end script
    foldl(go, x, replicate(n, f))
end applyN


-------- SAMPLE FUNCTIONS FOR REPEATED APPLICATION --------

on double(x)
    2 * x
end double


on plusArrow(s)
    s & " -> "
end plusArrow


on squareRoot(n)
    n ^ 0.5
end squareRoot

-------------------------- TESTS --------------------------
on run
    log applyN(10, double, 1)
    --> 1024
    
    log applyN(5, plusArrow, "")
    --> " ->  ->  ->  ->  -> "
    
    log applyN(3, squareRoot, 65536)
    --> 4.0
end run


-------------------- GENERIC FUNCTIONS --------------------

-- foldl :: (a -> b -> a) -> a -> [b] -> a
on foldl(f, startValue, xs)
    tell mReturn(f)
        set v to startValue
        set lng to length of xs
        repeat with i from 1 to lng
            set v to |λ|(v, item i of xs, i, xs)
        end repeat
        return v
    end tell
end foldl


-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
    -- 2nd class handler function lifted into 1st class script wrapper. 
    if script is class of f then
        f
    else
        script
            property |λ| : f
        end script
    end if
end mReturn

-- Egyptian multiplication - progressively doubling a list, appending
-- stages of doubling to an accumulator where needed for binary 
-- assembly of a target length
-- replicate :: Int -> a -> [a]
on replicate(n, a)
    set out to {}
    if 1 > n then return out
    set dbl to {a}
    
    repeat while (1 < n)
        if 0 < (n mod 2) then set out to out & dbl
        set n to (n div 2)
        set dbl to (dbl & dbl)
    end repeat
    return out & dbl
end replicate
Output:
(*1024*)
(* ->  ->  ->  ->  -> *)
(*4.0*)

Applesoft BASIC

http://hoop-la.ca/apple2/2016/winterwarmup/#repeat.bas

Arturo

print "---------------------------"
print "As a loop"
print "---------------------------"
loop 4 'x ->
    print "Example 1"

repeatFunc: function [f,times][
    loop times 'x ->
        do f
]

print "---------------------------"
print "With a block param"
print "---------------------------"
repeatFunc [print "Example 2"] 4

repeatFunc: function [f,times][
    loop times 'x ->
        f
]

print "---------------------------"
print "With a function param"
print "---------------------------"
repeatFunc $[][print "Example 3"] 4
Output:
---------------------------
As a loop
---------------------------
Example 1
Example 1
Example 1
Example 1
---------------------------
With a block param
---------------------------
Example 2
Example 2
Example 2
Example 2
---------------------------
With a function param
---------------------------
Example 3
Example 3
Example 3
Example 3

AutoHotkey

repeat("fMsgBox",3)
return

repeat(f, n){
	loop % n
		%f%()
}

fMsgBox(){
	MsgBox hello
}

AWK

# syntax: GAWK -f REPEAT.AWK
BEGIN {
    for (i=0; i<=3; i++) {
      f = (i % 2 == 0) ? "even" : "odd"
      @f(i) # indirect function call
    }
    exit(0)
}
function even(n,  i) {
    for (i=1; i<=n; i++) {
      printf("inside even %d\n",n)
    }
}
function odd(n,  i) {
    for (i=1; i<=n; i++) {
      printf("inside odd %d\n",n)
    }
}

output:

inside odd 1
inside even 2
inside even 2
inside odd 3
inside odd 3
inside odd 3

Batch File

@echo off

:_main
setlocal
call:_func1 _func2 3
pause>nul
exit/b

:_func1
setlocal enabledelayedexpansion
for /l %%i in (1,1,%2) do call:%1
exit /b

:_func2
setlocal
echo _func2 has been executed
exit /b

BQN

BQN has a builtin called Repeat which fulfills the criteria for the challenge(and allows multiple iteration counts), hence there is a recursive implementation of repeat added in as well.

•Show {2+𝕩}3 1

_repeat_  {(𝕘>0)(𝔽_𝕣_(𝕘-1)𝔽)𝕩}

•Show {2+𝕩} _repeat_ 3 1
7
7

C

#include <stdio.h>

void repeat(void (*f)(void), unsigned int n) {
 while (n-->0)
  (*f)(); //or just f()
}

void example() {
 printf("Example\n");
}

int main(int argc, char *argv[]) {
 repeat(example, 4);
 return 0;
}

C#

Translation of: Java
using System;

namespace Repeat {
    class Program {
        static void Repeat(int count, Action<int> fn) {
            if (null == fn) {
                throw new ArgumentNullException("fn");
            }
            for (int i = 0; i < count; i++) {
                fn.Invoke(i + 1);
            }
        }

        static void Main(string[] args) {
            Repeat(3, x => Console.WriteLine("Example {0}", x));
        }
    }
}
Output:
Example 1
Example 2
Example 3

C++

template <typename Function>
void repeat(Function f, unsigned int n) {
 for(unsigned int i=n; 0<i; i--)
  f();
}

usage:

#include <iostream>
void example() {
 std::cout << "Example\n";
}

repeat(example, 4);
Works with: C++11
 repeat([]{std::cout << "Example\n";}, 4);

Clojure

(defn repeat-function [f n] 
  (dotimes [i n] (f)))
Output:
user=> (repeat-function #(println "bork") 3)
bork
bork
bork

Common Lisp

(defun repeat (f n)
  (dotimes (i n) (funcall f)))

(repeat (lambda () (format T "Example~%")) 5)

Cowgol

include "cowgol.coh";

# Only functions that implement an interface can be passed around
# The interface is a type and must be defined before it is used
# This defines an interface for a function that takes no arguments
interface Fn();

# This function repeats a function that implements Fn
sub Repeat(f: Fn, n: uint32) is
    while n != 0 loop
        f();
        n := n - 1;
    end loop;
end sub;

# Here is a function
sub Foo implements Fn is
    print("foo ");
end sub;

# Prints "foo foo foo foo"
Repeat(Foo, 4);
print_nl();

D

void repeat(void function() fun, in uint times) {
    foreach (immutable _; 0 .. times)
        fun();
}

void procedure() {
    import std.stdio;
    "Example".writeln;
}

void main() {
    repeat(&procedure, 3);
}
Output:
Example
Example
Example

Delphi

program Repeater;

{$APPTYPE CONSOLE}
{$R *.res}

type
  TSimpleProc = procedure;     // Can also define types for procedures (& functions) which
                               // require params.

procedure Once;
begin
  writeln('Hello World');
end;

procedure Iterate(proc : TSimpleProc; Iterations : integer);
var
  i : integer;
begin
  for i := 1 to Iterations do
    proc;
end;

begin
  Iterate(Once, 3);
  readln;
end.

Alternative

program Repeater;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

procedure Iterate(proc: TProc; Iterations: integer);
var
  i: integer;
begin
  for i := 1 to Iterations do
    proc;
end;

begin
  Iterate(
    procedure
    begin
      writeln('Hello World');
    end, 3);
  readln;
end.


Output:
Hello World
Hello World
Hello World

EchoLisp

(define (repeat f n) (for ((i n)) (f)))

(repeat (lambda () (write (random 1000))) 5)
     287 798 930 989 794 

;; Remark
;; It is also possible to iterate a function : f(f(f(f( ..(f x)))))
(define cos10 (iterate cos 10)
(define cos100 (iterate cos10 10))
(cos100 0.6)
      0.7390851332151605
(cos 0.7390851332151605)
     0.7390851332151608 ;; fixed point found

F#

open System

let Repeat c f =
    for _ in 1 .. c do
        f()

let Hello _ = 
    printfn "Hello world"

[<EntryPoint>]
let main _ =
    Repeat 3 Hello

    0 // return an integer exit code

Factor

Factor comes with the times word which does exactly this. For example,

3 [ "Hello!" print ] times
Output:
Hello!
Hello!
Hello!

The implementation of times:

: times ( ... n quot: ( ... -- ... ) -- ... )
    [ drop ] prepose each-integer ; inline

Forth

: times ( xt n -- )
  0 ?do dup execute loop drop ;

Or, taking care to keep the data stack clean for the XT's use, as is often desired:

: times { xt n -- }
  n 0 ?do xt execute loop ;

Or as a novel control structure, which is not demanded by this task but which is just as idiomatic in Forth as the XT-consuming alternatives above:

: times[  ]] 0 ?do [[ ; immediate compile-only
: ]times  postpone loop ;  immediate compile-only

Usage:

[: cr ." Hello" ;] 3 times

: 3-byes ( -- )  3 times[ cr ." Bye" ]times ;
3-byes
Output:
Hello

Hello Hello Bye Bye

Bye

FreeBASIC

' FB 1.05.0 Win64

Sub proc()
  Print " proc called"
End Sub

Sub repeat(s As Sub, n As UInteger)
  For i As Integer = 1 To n
    Print Using "##"; i;
    s()
  Next
End Sub

repeat(@proc, 5)
Print
Print "Press any key to quit"
Sleep
Output:
 1 proc called
 2 proc called
 3 proc called
 4 proc called
 5 proc called

Gambas

Note: Gambas (3.14.0) cannot perform this task as specified, as it does not have delegates, and pointers do not seem to work with procedures. What does work is using Object.Call, which is intended for executing procedures from external libraries. However the accepting procedure must refer to the object containing the procedure, and refer to the procedure by a String name. In this case, the current module/class reference (Me) is used, but the String name must be passed. This arrangement will only work within the same module/class. It may be possible to pass the parent reference to a method (taking 3 parameters) in another class if the named procedure is Public. The empty array ([]) in Object.Call represent a procedure without parameters, which are not an explicit requirement for this Task, but might require another parameter to the accepting procedure.

Public Sub Main()

    RepeatIt("RepeatableOne", 2)

    RepeatIt("RepeatableTwo", 3)

End

'Cannot pass procedure pointer in Gambas; must pass procedure name and use Object.Call()
Public Sub RepeatIt(sDelegateName As String, iCount As Integer)

    For iCounter As Integer = 1 To iCount
        Object.Call(Me, sDelegateName, [])
    Next

End

Public Sub RepeatableOne()

    Print "RepeatableOne"

End

Public Sub RepeatableTwo()

    Print "RepeatableTwo"

End

Output:

RepeatableOne
RepeatableOne
RepeatableTwo
RepeatableTwo
RepeatableTwo

Go

package main

import "fmt"

func repeat(n int, f func()) {
  for i := 0; i < n; i++ {
    f()
  }
}

func fn() {
  fmt.Println("Example")
}

func main() {
  repeat(4, fn)
}

Haskell

Such a function already exists

import Control.Monad (replicateM_)

sampleFunction :: IO ()
sampleFunction = putStrLn "a"

main = replicateM_ 5 sampleFunction

And if the requirement is for something like a Church numeral, compounding the application of a given function n times (rather than repeating the same IO event n times) then we could also write something like applyN below:

applyN :: Int -> (a -> a) -> a -> a
applyN n f = foldr (.) id (replicate n f)

main :: IO ()
main = print $ applyN 10 (\x -> 2 * x) 1
Output:
1024

Isabelle

Isabelle does not have procedures with side effects. So we cannot do things such as printing a string to stdout. Isabelle only has pure mathematical functions.

theory Scratch
  imports Main
begin

text
Given the function we want to execute multiple times is of
type \<^typ>‹unit ⇒ unit›.

fun pure_repeat :: "(unit ⇒ unit) ⇒ nat ⇒ unit" where
  "pure_repeat _ 0 = ()"
| "pure_repeat f (Suc n) = f (pure_repeat f n)"

text
Functions are pure in Isabelle. They don't have side effects.
This means, the \<^const>‹pure_repeat› we implemented is always equal
to \<^term>‹() :: unit›, independent of the function \<^typ>‹unit ⇒ unit›
or \<^typ>‹nat›.
Technically, functions are not even "executed", but only evaluated.

lemma "pure_repeat f n = ()" by simp

text
But we can repeat a value of \<^typ>‹'a› \<^term>‹n› times and return the result
in a list of length \<^term>‹n›

fun repeat :: "'a ⇒ nat ⇒ 'a list" where
  "repeat _ 0 = []"
| "repeat f (Suc n) = f # (repeat f n)"

lemma "repeat ''Hello'' 4 = [''Hello'', ''Hello'', ''Hello'', ''Hello'']"
  by code_simp

lemma "length (repeat a n) = n" by(induction n) simp+

text
Technically, \<^typ>‹'a› is not a function. We can wrap it in a dummy function
which takes a \<^typ>‹unit› as first argument. This gives a function of type
\<^typ>‹unit ⇒ 'a›.


fun fun_repeat :: "(unit ⇒ 'a) ⇒ nat ⇒ 'a list" where
  "fun_repeat _ 0 = []"
| "fun_repeat f (Suc n) = (f ()) # (fun_repeat f n)"

lemma "fun_repeat (λ_. ''Hello'') 4 =
       [''Hello'', ''Hello'', ''Hello'', ''Hello'']"
  by code_simp

text
Yet, \<^const>‹fun_repeat› with the dummy function \<^typ>‹unit ⇒ 'a› is
equivalent to \<^const>‹repeat› with the value \<^typ>‹'a› directly.

lemma "fun_repeat (λ_. a) n = repeat a n" by(induction n) simp+

end

J

   NB. ^: (J's power conjunction) repeatedly evaluates a verb.

   NB. Appending to a vector the sum of the most recent
   NB. 2 items can generate the Fibonacci sequence.

   (, [: +/ _2&{.)  (^:4)  0 1
0 1 1 2 3 5
   

   NB. Repeat an infinite number of times
   NB. computes the stable point at convergence

   cosine =: 2&o.

   cosine (^:_ ) 2    NB. 2 is the initial value
0.739085
   
   cosine 0.739085  NB. demonstrate the stable point x==Cos(x)
0.739085
   

   cosine^:(<_) 2  NB. show the convergence
2 _0.416147 0.914653 0.610065 0.819611 0.682506 0.775995 0.713725 0.755929 0.727635 0.74675 0.733901 0.742568 0.736735 0.740666 0.738019 0.739803 0.738602 0.739411 0.738866 0.739233 0.738986 0.739152 0.73904 0.739116 0.739065 0.739099 0.739076 0.739091 0.7...


   # cosine^:(<_) 2  NB. iteration tallyft
78

   f =: 3 :'smoutput ''hi'''

   f''
hi
   
   NB. pass verbs via a gerund
   repeat =: dyad def 'for_i. i.y do. (x`:0)0 end. EMPTY'

   (f`'')repeat 4
hi
hi
hi
hi
   
   

   NB. pass a verb directly to an adverb

   Repeat =: adverb def 'for_i. i.y do. u 0 end. EMPTY'

   f Repeat 4
hi
hi
hi
hi

Java

Works with: Java version 8
import java.util.function.Consumer;
import java.util.stream.IntStream;

public class Repeat {

    public static void main(String[] args) {
        repeat(3, (x) -> System.out.println("Example " + x));
    }

    static void repeat (int n, Consumer<Integer> fun) {
        IntStream.range(0, n).forEach(i -> fun.accept(i + 1));
    }
}

Output:

Example 1
Example 2
Example 3

jq

Works with: jq version 1.4

We first define "repeat" naively but in accordance with the task specification; we then define an optimized version that illustrates a general technique for taking advantage of jq's support for tail-call optimization (TCO).

Since jq is a purely functional language, repeat(f; n) is unlikely to be very useful so we define a similar filter, repeatedly(f; n), which generates n+1 terms: . (the input), f, f|f, ... ; that is, using conventional functional notation, it generates: x, f(x), f(f(x)), ...

Unoptimized version:

def unoptimized_repeat(f; n):
  if n <= 0 then empty
  else f, repeat(f; n-1)
  end;

Optimized for TCO:

def repeat(f; n):
  # state: [count, in]
  def r:
    if .[0] >= n then empty else (.[1] | f), (.[0] += 1 | r) end;
  [0, .] | r;

Variant:

# If n is a non-negative integer,
# then emit a stream of (n + 1) terms: ., f, f|f, f|f|f, ...
def repeatedly(f; n):
  # state: [count, in]
  def r:
    if .[0] < 0 then empty
    else .[1], ([.[0] - 1, (.[1] | f)] | r)
    end;
  [n, .] | r;

Examples:

0 | [ repeat(.+1; 3) ]

produces: [1,1,1]

0 | repeatedly(.+1; 3)

produces:

0 
1 
2
3

Julia

function sayHi()
	println("Hi")
end

function rep(f, n)
	for i = 1:n f() end
end

rep(sayHi, 3)
Output:
Hi
Hi
Hi

Kotlin

// version 1.0.6

fun repeat(n: Int, f: () -> Unit) {
    for (i in 1..n) {
        f()
        println(i)
    }
}

fun main(args: Array<String>) {
    repeat(5) { print("Example ") }
}
Output:
Example 1
Example 2
Example 3
Example 4
Example 5

Lean

It runs on Lean 3.4.2:

def repeat :   (  string)  string 
  | 0 f       := "done"
  | (n + 1) f :=  (f n) ++ (repeat n f) 


#eval repeat 5 $ λ b :  , "me "

LiveCode

rep "answer",3

command rep x,n
    repeat n times
        do merge("[[x]] [[n]]")
    end repeat
end rep

Lua

No particular magic required as Lua allows functions to be passed as arguments.

function myFunc ()
    print("Sure looks like a function in here...")
end

function rep (func, times)
    for count = 1, times do
        func()
    end
end

rep(myFunc, 4)
Output:
Sure looks like a function in here...
Sure looks like a function in here...
Sure looks like a function in here...
Sure looks like a function in here...

Mathematica/Wolfram Language

Note that anything of this form is not considered good practice.

repeat[f_, n_] := Do[f[], {n}];
repeat[Print["Hello, world!"] &, 5];
Output:
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!

min

This operator already exists in min and is called times.

Works with: min version 0.19.6
("Hello" puts!) 3 times
Output:
Hello
Hello
Hello

MiniScript

sayHi = function()
    print "Hi!"
end function

rep = function(f, n)
    for i in range(1, n)
        f
    end for
end function

rep @sayHi, 3
Output:
Hi!
Hi!
Hi!

МК-61/52

1	П4

3	^	1	6	ПП	09	С/П

П7	<->	П0	КПП7	L0	12	В/О

ИП4	С/П	КИП4	В/О

Modula-2

MODULE Repeat;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;

TYPE F = PROCEDURE;

PROCEDURE Repeat(fun : F; c : INTEGER);
VAR i : INTEGER;
BEGIN
    FOR i:=1 TO c DO
        fun
    END
END Repeat;

PROCEDURE Print;
BEGIN
    WriteString("Hello");
    WriteLn
END Print;

BEGIN
    Repeat(Print, 3);

    ReadChar
END Repeat.

Nanoquery

Translation of: Python
def repeat(f,n)
    for i in range(1, n)
        f()
    end
end

def procedure()
    println "Example"
end

repeat(procedure, 3)

Nim

proc example = 
  echo "Example"

# Ordinary procedure
proc repeatProc(fn: proc, n: int) = 
  for x in 0..<n:
    fn()

repeatProc(example, 4)

# Template (code substitution), simplest form of metaprogramming
# that Nim has
template repeatTmpl(n: int, body: untyped): untyped = 
  for x in 0..<n:
    body

# This gets rewritten into a for loop
repeatTmpl 4:
  example()

import std/macros
# A macro which takes some code block and returns code
# with that code block repeated n times. Macros run at
# compile-time
macro repeatMacro(n: static[int], body: untyped): untyped = 
  result = newStmtList()

  for x in 0..<n:
    result.add body

# This gets rewritten into 4 calls to example()
# at compile-time
repeatMacro 4:
  example()

Objeck

class Repeat {
  function : Main(args : String[]) ~ Nil {
    Repeat(Example() ~ Nil, 3);
  }
  
  function : Repeat(e : () ~ Nil, i : Int) ~ Nil {
    while(i-- > 0) {
      e();
    };
  }
  
  function : Example() ~ Nil {
    "Example"->PrintLine();
  }
}

OCaml

let repeat ~f ~n =
  for i = 1 to n do
    f ()
  done

let func () =
  print_endline "Example"

let () =
  repeat ~n:4 ~f:func

Oforth

This method is already defined : times. This method can be used on all runnables (functions, methods, blocks, ...).

: hello "Hello, World!" println ;
10 #hello times
Output:
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!

Ol

; sample function
(define (function) (display "+"))

; simple case for 80 times
(for-each (lambda (unused) (function)) (iota 80))
(print) ; print newline
; ==> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; detailed case for 80 times
(let loop ((fnc function) (n 80))
   (unless (zero? n)
      (begin
         (fnc)
         (loop fnc (- n 1)))))
(print) ; print newline
; ==> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PARI/GP

repeat(f, n)=for(i=1,n,f());
repeat( ()->print("Hi!"), 2);
Output:
Hi!
Hi!

Pascal

program Repeater;

type
  TProc = procedure(I: Integer);

procedure P(I: Integer);
begin
  WriteLn('Iteration ', I);
end;

procedure Iterate(P: TProc; N: Integer);
var
  I: Integer;
begin
  for I := 1 to N do
    P(I);
end;

begin
  Iterate(P, 3);
end.
Output:
Iteration           1
Iteration           2
Iteration           3

Perl

Translation of: C
sub repeat {
    my ($sub, $n) = @_;
    $sub->() for 1..$n;
}

sub example {
    print "Example\n";
}

repeat(\&example, 4);

Phix

procedure Repeat(integer rid, integer n)
    for i=1 to n do
        rid()
    end for
end procedure
 
procedure Hello()
    ?"Hello"
end procedure
 
Repeat(Hello,5)

Phixmonti

def myFunc
    "Sure looks like a function in here..." print nl
enddef
 
def rep /# func times -- #/
    for drop
	dup exec
    endfor
    drop
enddef

getid myFunc 4 rep

PicoLisp

# The built-in function "do" can be used to achieve our goal,
# however, it has a slightly different syntax than what the
# problem specifies.

# Native solution.
(do 10 (version))

# Our solution.
(de dofn (Fn N)
   (do N (Fn)) )

(dofn version 10)

PowerShell

Translation of: Python

(Made more PowerShelly.)

function Out-Example
{
    "Example"
}

function Step-Function ([string]$Function, [int]$Repeat)
{
    for ($i = 1; $i -le $Repeat; $i++)
    { 
        "$(Invoke-Expression -Command $Function) $i"
    }
}

Step-Function Out-Example -Repeat 3
Output:
Example 1
Example 2
Example 3

Prolog

repeat(_, 0).
repeat(Callable, Times) :-
	succ(TimesLess1, Times),
	Callable,
	repeat(Callable, TimesLess1).

test :- write('Hello, World'), nl.	
test(Name) :- format('Hello, ~w~n', Name).
Output:
?- repeat(test, 3).
Hello, World
Hello, World
Hello, World
true ;
false.

?- repeat(test('Fred'), 3).
Hello, Fred
Hello, Fred
Hello, Fred
true ;
false.

PureBasic

Prototype.i fun(x.i)

Procedure.i quark(z.i)
  Debug "Quark "+Str(z) : ProcedureReturn z-1
EndProcedure

Procedure rep(q.fun,n.i)
  Repeat : n=q(n) : Until n=0
EndProcedure

rep(@quark(),3)
Output:
Quark 3
Quark 2
Quark 1

Python

Procedural

#!/usr/bin/python
def repeat(f,n):
  for i in range(n):
    f();

def procedure():
  print("Example");

repeat(procedure,3); #prints "Example" (without quotes) three times, separated by newlines.

Functional

Repeated function application:

Works with: Python version 3.7
'''Application of a given function, repeated N times'''

from itertools import repeat
from functools import reduce
from inspect import getsource


# applyN :: Int -> (a -> a) -> a -> a
def applyN(n):
    '''n compounding applications of the supplied
       function f. Equivalent to Church numeral n.
    '''
    def go(f):
        return lambda x: reduce(
            lambda a, g: g(a), repeat(f, n), x
        )
    return lambda f: go(f)


# MAIN ----------------------------------------------------
def main():
    '''Tests - compounding repetition
       of function application.
    '''
    def f(x):
        return x + 'Example\n'

    def g(x):
        return 2 * x

    def h(x):
        return 1.05 * x

    print(
        fTable(__doc__ + ':')(
            lambda fx: '\nRepeated * 3:\n (' + (
                getsource(fst(fx)).strip() + ')(' +
                repr(snd(fx)) + ')'
            )
        )(str)(
            liftA2(applyN(3))(fst)(snd)
        )([(f, '\n'), (g, 1), (h, 100)])
    )


# GENERIC -------------------------------------------------

# compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
def compose(g):
    '''Right to left function composition.'''
    return lambda f: lambda x: g(f(x))


# fst :: (a, b) -> a
def fst(tpl):
    '''First member of a pair.'''
    return tpl[0]


# liftA2 :: (a0 -> b -> c) -> (a -> a0) -> (a -> b) -> a -> c
def liftA2(op):
    '''Lift a binary function to a composition
       over two other functions.
       liftA2 (*) (+ 2) (+ 3) 7 == 90
    '''
    def go(f, g):
        return lambda x: op(
            f(x)
        )(g(x))
    return lambda f: lambda g: go(f, g)


# snd :: (a, b) -> b
def snd(tpl):
    '''Second member of a pair.'''
    return tpl[1]


# fTable :: String -> (a -> String) ->
#                     (b -> String) -> (a -> b) -> [a] -> String
def fTable(s):
    '''Heading -> x display function -> fx display function ->
                     f -> xs -> tabular string.
    '''
    def go(xShow, fxShow, f, xs):
        ys = [xShow(x) for x in xs]
        w = max(map(len, ys))
        return s + '\n' + '\n'.join(map(
            lambda x, y: y.rjust(w, ' ') + ' -> ' + fxShow(f(x)),
            xs, ys
        ))
    return lambda xShow: lambda fxShow: lambda f: lambda xs: go(
        xShow, fxShow, f, xs
    )


# MAIN ---
if __name__ == '__main__':
    main()
Output:
Application of a given function, repeated N times:

Repeated * 3:
 (def f(x):
        return x + 'Example\n')('\n') -> 
Example
Example
Example

             
Repeated * 3:
 (def g(x):
        return 2 * x)(1) -> 8
        
Repeated * 3:
 (def h(x):
        return 1.05 * x)(100) -> 115.7625

Quackery

This is a function which is part of the Quackery language. times performs the word or nest after it the number of times specified on the stack. The definition is reproduced here, along with the additional functionality included in the language; i counts down to zero, i^ counts up from zero, step specifies the increment size from an argument on the stack (default is 1), conclude sets the iteration countdown to the final value (0) and refresh sets the iteration countdown to the initial value. times is nestable, and words such as witheach (which makes use of times to iterate over a nest) inherit its additional functionality.

The word rosetta-times is also defined here, using times. It takes both the repeat number and the function as stack arguments.

  [ stack ]                     is times.start  (     --> s   )
  protect times.start

  [ stack ]                     is times.count  (     --> s   )
  protect times.count

  [ stack ]                     is times.action (     --> s   )
  protect times.action

  [ ]'[ times.action put
    dup times.start put
    [ 1 - dup -1 > while
      times.count put
      times.action share do
      times.count take again ]
    drop
    times.action release
    times.start release ]       is times         (   n -->   )

  [ times.count share ]         is i             (     --> n )

  [ times.start share i 1+ - ]  is i^            (     --> n )

  [ 0 times.count replace ]     is conclude      (     -->   )

  [ times.start share
    times.count replace ]       is refresh       (     -->   )

  [ times.count take 1+
    swap - times.count put ]    is step          (     --> s )

  [ nested ' times nested 
    swap join do ]              is rosetta-times ( n x -->   )
Output:

rosetta-times demonstrated in the Quackery shell. (REPL)

/O> [ say "hello" cr ] is hi 
... 5 ' hi rosetta-times
... 
hello
hello
hello
hello
hello

Stack empty.

R

f1 <- function(...){print("coucou")}

f2 <-function(f,n){
lapply(seq_len(n),eval(f))
}

f2(f1,4)

Racket

The racket guide has a section called "Iterators and Comprehensions", which shows that for isn't just for repeating n times!

#lang racket/base
(define (repeat f n) ; the for loop is idiomatic of (although not exclusive to) racket
  (for ((_ n)) (f)))

(define (repeat2 f n) ; This is a bit more "functional programmingy"
  (when (positive? n) (f) (repeat2 f (sub1 n))))

(display "...")
(repeat (λ () (display " and over")) 5)
(display "...")
(repeat2 (λ () (display " & over")) 5)
(newline)
Output:
... and over and over and over and over and over... & over & over & over & over & over

Raku

(formerly Perl 6)

sub repeat (&f, $n) { f() xx $n };

sub example { say rand }

repeat(&example, 3);
Output:
0.435249779778396
0.647701200726486
0.279289335968417

Of course, we could have just written

example() xx 3;

or even

(say rand) xx 3;

directly – the custom repeat subroutine is just here to satisfy the task description.

Notes on the xx operator:

  • Unlike other operators, it evaluates its left-hand-side argument lazily - that's why we can simply call f() there rather than passing it as a function object.
  • The operator has a return value: A list consisting of the return values of the left-hand-side (and building lists is in fact what xx is usually used for).

General notes:

  • The & sigil in the repeat subroutine signature restricts that parameter to types that implement the Callable role, and makes it available inside the repeat subroutine body as if it were a lexically scoped sub.
  • The parentheses in the last line are necessary to disambiguate it as a call to our custom subroutine, rather than an attempt to use the built-in repeat { ... } while ... construct.

Red

Red[]

myrepeat: function [fn n] [loop n [do fn]]

myrepeat [print "hello"] 3
Output:
hello
hello
hello

REXX

The procedure name (that is being repeatedly executed) isn't restricted to an   internal   REXX subroutine (procedure),
it may be an   external   program (procedure) written in any language.

/*REXX program   executes   a  named  procedure  a specified number of times.           */
parse arg pN # .                                 /*obtain optional arguments from the CL*/
if #=='' | #==","   then #= 1                    /*assume  once  if not specified.      */
if pN\==''          then call repeats pN, #      /*invoke the REPEATS procedure for  pN.*/
exit 0                                           /*stick a fork in it,  we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
repeats: procedure;  parse arg x,n               /*obtain the procedureName & # of times*/
                do n;  interpret 'CALL' x;  end  /*repeat the invocation    N    times. */
         return                                  /*return to invoker of the REPEATS proc*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
yabba:   say 'Yabba, yabba do!';          return /*simple code;  no need for  PROCEDURE.*/
output   when using the input of:     yabba   4
Yabba, yabba do!
Yabba, yabba do!
Yabba, yabba do!
Yabba, yabba do!

output when the input is:   $date 3

[The (external)   $DATE.REX   program isn't supplied here.]

day-of-year= 159                Gregorian date= 06/08/2014               Sunday
day-of-year= 159                Gregorian date= 06/08/2014               Sunday
day-of-year= 159                Gregorian date= 06/08/2014               Sunday

Ring

Func Main
     times(5,:test)

Func Test
     see "Message from the test function!" + nl

Func Times nCount, F
     for x = 1 to nCount
         Call F()
     next

Ruby

4.times{ puts "Example" }  # idiomatic way

def repeat(proc,num)
  num.times{ proc.call }
end

repeat(->{ puts "Example" }, 4)

Rust

Rust has higher-order functions.

fn repeat(f: impl FnMut(usize), n: usize) {
    (0..n).for_each(f);
}

Here we define the function repeat which takes the function Fn(usize), which is an anonymous trait constraint by the impl Trait syntax, in such a way that it's size can be known statically at compile time. The range iterator 0..n is used, in combination with the Iterator::for_each method to consume it.

Closure

It's idiomatic to use a closure.

fn main() {
    repeat(|x| print!("{};", x), 5);
}
Output:
0;1;2;3;4;

Static Function

Also possible to define a static function.

fn function(x: usize) {
    print!("{};", x);
}

fn main() {
    repeat(function, 4);
}
Output:
0;1;2;3;

Static Method

Sometimes it may be convenient to call a static method.

struct Foo;
impl Foo {
    fn associated(x: usize) {
        print!("{};", x);
    }
}

fn main() {
    repeat(Foo::associated, 8);
}
Output:
0;1;2;3;4;5;6;7;

Trait Method

You can also use implemented trait-methods as a function-argument. This works because the implemented type is usize which is what the iterator supplied to Fn(usize).

trait Bar {
    fn run(self);
}

impl Bar for usize {
    fn run(self) {
        print!("{};", self);
    }
}

fn main() {
    repeat(Bar::run, 6);
}
Output:
0;1;2;3;4;5;

Mutable Closure

The most interesting application would probably be a mutable closure, which requires changing the type signature from Fn to FnMut, because they are constrained by slightly different rules, but otherwise work the same.

fn repeat(f: impl FnMut(usize), n: usize) {
    (0..n).for_each(f);
}

fn main() {
    let mut mult = 1;
    repeat(|x| {
        print!("{};", x * mult);
        mult += x;
    }, 5);
}
Output:
0;1;4;12;28;

Scala

Intuitive solution

  1. Call by name
  2. Type parameterization
  3. Higher order function
  def repeat[A](n:Int)(f: => A)= ( 0 until n).foreach(_ => f)

  repeat(3) { println("Example") }

Advanced Scala-ish

  1. Call by name
  2. Type parameterization
  3. Implicit method
  4. Tail recursion
  5. Infix notation
object Repeat2 extends App {
  
   implicit class IntWithTimes(x: Int) {
      def times[A](f: => A):Unit = {
    @tailrec
      def loop( current: Int): Unit =
        if (current > 0) {
          f
          loop(current - 1)
        }
      loop(x)
    }
  }

  5 times println("ha") // Not recommended infix for 5.times(println("ha")) aka dot notation
}

Most Scala-ish

  1. Call by name
  2. Type parameterization
  3. Implicit method
  4. Tail recursion
  5. Infix notation
  6. Operator overloading
import scala.annotation.tailrec

object Repeat3 extends App {

  implicit class UnitWithNtimes(f: => Unit) {
    def *[A](n: Int): Unit = { // Symbol * used instead of literal method name
      @tailrec
      def loop(current: Int): Unit =
        if (current > 0) {
          f
          loop(current - 1)
        }
      loop(n)
    }
  }

  print("ha") * 5 // * is the method, effective should be A.*(5) 
}

Scheme

Scheme is mostly made up from expressions which return values. However some functions, such as display, return an unspecified value. The actual value returned varies depending on the Scheme implementation itself.

(import (scheme base)
        (scheme write))

(define (repeat proc n)
  (do ((i 0 (+ 1 i))
       (res '() (cons (proc) res)))
    ((= i n) res)))

;; example returning an unspecified value
(display (repeat (lambda () (display "hi\n")) 4)) (newline)

;; example returning a number
(display (repeat (lambda () (+ 1 2)) 5)) (newline)
Output:

(Using chibi-scheme: returns #<undef> from display.)

hi
hi
hi
hi
(#<undef> #<undef> #<undef> #<undef>)
(3 3 3 3 3)

Seed7

$ include "seed7_05.s7i";

const proc: myRepeat (in integer: times, in proc: aProcedure) is func
  local
    var integer: n is 0;
  begin
    for n range 1 to times do
      aProcedure;
    end for;
  end func;

const proc: main is func
  begin
    myRepeat(3, writeln("Hello!"));
  end func;
Output:
Hello!
Hello!
Hello!

Sidef

func repeat(f, n) {
    { f() } * n;
}

func example {
    say "Example";
}

repeat(example, 4);

Standard ML

fun repeat (_, 0) = ()
  | repeat (f, n) = (f (); repeat (f, n - 1))

fun testProcedure () =
  print "test\n"

val () = repeat (testProcedure, 5)

Stata

function repeat(f,n) {
	for (i=1; i<=n; i++) (*f)()
}

function hello() {
	printf("Hello\n")
}

repeat(&hello(),3)

Swift

func repeat(n: Int, f: () -> ()) {
  for _ in 0..<n {
    f()
  }
}

repeat(4) { println("Example") }

Tcl

The usual way of doing a repeat would be:

proc repeat {command count} {
    for {set i 0} {$i < $count} {incr i} {
        uplevel 1 $command
    }
}

proc example {} {puts "This is an example"}
repeat example 4

However, the time command can be used as long as the return value (the report on the timing information) is ignored.

time example 4

It should be noted that the “command” can be an arbitrary script, not just a call to a procedure:

repeat {puts "hello world"} 3

uBasic/4tH

Proc _Repeat (_HelloWorld, 5) : End

_Repeat Param (2) : Local (1) : For c@ = 1 To b@ : Proc a@ : Next : Return
_HelloWorld Print "Hello world!" : Return

Output:

Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

0 OK, 0:35 

Ursa

def repeat (function f, int n)
	for (set n n) (> n 0) (dec n)
		f
	end for
end repeat

def procedure ()
	out "Hello! " console
end procedure

# outputs "Hello! " 5 times
repeat procedure 5

VBA

Translation of: Phix
Private Sub Repeat(rid As String, n As Integer)
    For i = 1 To n
        Application.Run rid
    Next i
End Sub
 
Private Sub Hello()
    Debug.Print "Hello"
End Sub
 
Public Sub main()
    Repeat "Hello", 5
End Sub

Verilog

module main;
    initial begin
        repeat(5) begin
            $display("Inside loop");
        end
        $display("Loop Ended");
    end
endmodule
Output:
Inside loop
Inside loop
Inside loop
Inside loop
Inside loop
Loop Ended

Visual Basic .NET

Translation of: C#
Module Module1

    Sub Repeat(count As Integer, fn As Action(Of Integer))
        If IsNothing(fn) Then
            Throw New ArgumentNullException("fn")
        End If

        For i = 1 To count
            fn.Invoke(i)
        Next
    End Sub

    Sub Main()
        Repeat(3, Sub(x) Console.WriteLine("Example {0}", x))
    End Sub

End Module
Output:
Example 1
Example 2
Example 3

Vlang

fn repeat(n int, f fn()) {
  for _ in 0.. n {
    f()
  }
}
 
fn func() {
  println("Example")
}
 
fn main() {
  repeat(4, func)
}
Output:
Example
Example
Example
Example

Wren

var f = Fn.new { |g, n|
    for (i in 1..n) g.call(n)
}

var g = Fn.new { |k|
    for (i in 1..k) System.write("%(i) ")
    System.print()
}

f.call(g, 5)
Output:
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

XBS

XBS has a built-in repeat keyword.

func rep(callback:function,amount:number,*args:array=[]):null{
	repeat amount {
		callback(*args);
	}
}

rep(func(a,b,c){
	log(a+b+c);
},3,1,2,3);
Output:
6
6
6

XLISP

(defun repeat (f n)
    (f)
    (if (> n 1)
        (repeat f (- n 1)) ) )

;; an example to test it:
(repeat (lambda () (print '(hello rosetta code))) 5)
Output:
(HELLO ROSETTA CODE) 
(HELLO ROSETTA CODE) 
(HELLO ROSETTA CODE) 
(HELLO ROSETTA CODE) 
(HELLO ROSETTA CODE)

Yabasic

Translation of: Lua
sub myFunc ()
    print "Sure looks like a function in here..."
end sub
 
sub rep (func$, times)
    for count = 1 to times
        execute(func$)
    next
end sub
 
rep("myFunc", 4)

Z80 Assembly

Return Trick

This technique is called the "Return Trick", it's efficient but makes the program more difficult to read. It works on the principle that the processor's RET command assumes the return address is the top item of the stack. The programmer can abuse this to "return" to a section of code that has never actually been executed. This is essentially just another form of the computed goto. Most processors that use the stack to store return addresses can use this technique, though the method of doing it depends on the processor itself.

ld b,&05  ;load the decrement value into b
ld hl,myFunc ;load the address of "myFunc" into HL

call repeatProcedure

forever:
jp forever ;trap the program counter here

repeatProcedure: ;input: b = times to repeat, hl = which procedure to repeat
call trampoline
; the "ret" in myFunc will bring you here
djnz repeatProcedure
ret ;exit "repeatProcedure" and proceed to "forever"

trampoline:
push hl
ret     
;this is effectively a call to whatever is in HL, in this case "myFunc." The "ret" at the end of myFunc will return us to 
;just after the line "call trampoline"


myFunc: ;this doesn't do anything useful but that's not the point
push hl ;not needed for this routine but if it altered HL we would need this so that we come back here next time we loop
or a
pop hl
ret

Indirect Jump

Same as above but uses an indirect jump to the address in HL.

trampoline:
jp (hl) ;despite the parentheses this does NOT dereference HL, it merely acts as "LD PC,HL".

Using self-modifying code

This method assumes the routine doesn't use the B register, or restores it before returning. Also, the actual "wrapper" used to repeat the passed function must be in RAM so that its instructions can be modified at runtime.

LD HL,myFunc LD (repeatproc+1),HL LD B,5 ;repeat count CALL repeatProc

somewhere far away from here

repeatProc: call &0000 ;gets overwritten with the address of MyFunc djnz repeatProc ret</syntaxhighlight>

zkl

fcn repeat(f,n){ do(n){ f() } }
repeat("ho ".print,3);
Output:
ho ho ho