Repeat: Difference between revisions

34,558 bytes added ,  26 days ago
m
 
(70 intermediate revisions by 40 users not shown)
Line 1:
{{draft task}}
 
;Task:
Line 6:
The latter procedure is executed a number of times equal to the accepted integer.
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F repeat(f, n)
L 1..n
f()
 
F procedure()
print(‘Example’)
 
repeat(procedure, 3)</syntaxhighlight>
 
{{out}}
<pre>
Example
Example
Example
</pre>
 
=={{header|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.
 
<syntaxhighlight lang="6502asm">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.</syntaxhighlight>
 
Once the macro and the underlying subroutine are created, this is very simple to use:
<syntaxhighlight lang="6502asm">RepeatProc foo,#20 ;perform the subroutine "foo" twenty times.</syntaxhighlight>
===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.
<syntaxhighlight lang="6502asm">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</syntaxhighlight>
 
=={{header|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.")
<syntaxhighlight lang="68000devpac"> 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</syntaxhighlight>
 
{{out}}
<pre>!!!!</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="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</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Repeat.png Screenshot from Atari 8-bit computer]
<pre>
Action!
Action!
Action!
Action!
Action!
</pre>
 
=={{header|Ada}}==
 
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
 
procedure Repeat_Example is
Line 27 ⟶ 164:
begin
Repeat(Hello'Access, 3); -- Hello'Access points to the procedure Hello
end Repeat_Example;</langsyntaxhighlight>
 
Output:
Line 34 ⟶ 171:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<langsyntaxhighlight lang="algol68">
# operator that executes a procedure the specified number of times #
OP REPEAT = ( INT count, PROC VOID routine )VOID:
Line 60 ⟶ 197:
 
)
</syntaxhighlight>
</lang>
Output:
<pre>
Line 70 ⟶ 207:
+3 +9
</pre>
 
=={{header|ALGOL W}}==
As well as the names of procedures, Algol W allows statements to be passed as parameters where a procedure is expected.
<syntaxhighlight lang="algolw">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.</syntaxhighlight>
{{out}}
<pre>
hello
hello
hello
1 4 9 16 25 36 49 64 81 100
</pre>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="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</syntaxhighlight>
{{Out}}
<pre>(*1024*)
(* -> -> -> -> -> *)
(*4.0*)</pre>
 
=={{header|Applesoft BASIC}}==
https://web.archive.org/web/20190202165511/http://hoop-la.ca/apple2/2016/winterwarmup/#repeat.bas
<syntaxhighlight> 100 FOR I = 768 TO 794
110 READ B: POKE I,B: NEXT
120 DATA165,185,72,165,184,72
130 DATA165,118,72,165,117,72
140 DATA169,176,72,32,123,221
150 DATA32,82,231,32,65,217
160 DATA76,210,215
170 POKE 1014,0: POKE 1015,3
 
200 LET P = 400:N = 4
210 GOSUB 300"REPEAT P N
220 END
 
300 IF N < = 0 THEN RETURN
310 LET N = N - 1
320 & P
330 GOTO 300
 
400 PRINT "EXAMPLE"
410 RETURN
</syntaxhighlight>
 
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">print "---------------------------"
print "As a loop"
print "---------------------------"
loop 4 'x ->
print "Example 1"
 
repeatFunc: function [f,times][
<lang arturo>proc: {
loop times 'x ->
print "I'm in proc!"
do f
}
]
 
print "---------------------------"
repeat: @(func times){
print "With a block param"
loop 0..times-1 {
print "---------------------------"
func ~
repeatFunc [print "Example 2"] 4
}
}
 
repeatFunc: function [f,times][
repeat proc 3</lang>
loop times 'x ->
f
]
 
print "---------------------------"
print "With a function param"
print "---------------------------"
repeatFunc $[][print "Example 3"] 4</syntaxhighlight>
 
{{out}}
 
<pre>---------------------------
<pre>I'm in proc!
As a loop
I'm in proc!
---------------------------
I'm in proc!</pre>
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</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">repeat("fMsgBox",3)
return
 
Line 105 ⟶ 412:
fMsgBox(){
MsgBox hello
}</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f REPEAT.AWK
BEGIN {
Line 127 ⟶ 434:
}
}
</syntaxhighlight>
</lang>
<p>output:</p>
<pre>
Line 137 ⟶ 444:
inside odd 3
</pre>
 
=={{header|BASIC}}==
==={{header|BASIC256}}===
<syntaxhighlight lang="vb">subroutine proc()
print " Inside loop"
end subroutine
 
subroutine repeat(func, times)
for i = 1 to times
call proc()
next
end subroutine
 
call repeat("proc", 5)
print "Loop Ended</syntaxhighlight>
{{out}}
<pre> Inside loop
Inside loop
Inside loop
Inside loop
Inside loop
Loop Ended</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">10 sub proc()
20 print " Inside loop"
30 end sub
40 sub repeat(func$,times)
50 for i = 1 to times
60 proc()
70 next i
80 end sub
90 repeat("proc",5)
100 print "Loop Ended"
110 end</syntaxhighlight>
{{out}}
<pre>Same as BASIC256 entry.</pre>
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
{{works with|Chipmunk Basic}}
{{works with|Just BASIC}}
{{works with|Minimal BASIC}}
{{works with|MSX BASIC|any}}
{{works with|PC-BASIC|any}}
{{works with|QBasic}}
{{works with|Quite BASIC}}
<syntaxhighlight lang="qbasic">100 let f$ = "proc"
110 let c = 5
120 gosub 170
130 print "Loop Ended"
140 goto 220
150 print " Inside loop"
160 return
170 rem repeat(f$,c)
180 for i = 1 to c
190 gosub 150
200 next i
210 return
220 end</syntaxhighlight>
{{out}}
<pre>Same as BASIC256 entry.</pre>
 
==={{header|Minimal BASIC}}===
The [[#GW-BASIC|GW-BASIC]] solution works without any changes.
 
==={{header|MSX Basic}}===
The [[#GW-BASIC|GW-BASIC]] solution works without any changes.
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">DECLARE SUB rep (func AS STRING, c AS INTEGER)
DECLARE SUB proc ()
 
CALL rep("proc", 5)
PRINT "Loop Ended"
 
SUB proc
PRINT " Inside loop"
END SUB
 
SUB rep (func AS STRING, c AS INTEGER)
FOR i = 1 TO c
proc
NEXT
END SUB</syntaxhighlight>
{{out}}
<pre>Same as BASIC256 entry.</pre>
 
==={{header|Quite BASIC}}===
The [[#GW-BASIC|GW-BASIC]] solution works without any changes.
 
==={{header|True BASIC}}===
<syntaxhighlight lang="qbasic">SUB proc
PRINT " Inside loop"
END SUB
 
SUB rep (func$, c)
FOR i = 1 to c
CALL proc
NEXT i
END SUB
 
CALL rep ("proc", 5)
PRINT "Loop Ended"
END</syntaxhighlight>
{{out}}
<pre>Same as BASIC256 entry.</pre>
 
==={{header|XBasic}}===
{{works with|Windows XBasic}}
<syntaxhighlight lang="qbasic">PROGRAM "Repeat"
VERSION "0.0000"
 
DECLARE FUNCTION Entry ()
DECLARE FUNCTION Proc ()
DECLARE FUNCTION Repe (func$, c)
 
FUNCTION Entry ()
Repe ("proc", 5)
PRINT "Loop Ended"
 
END FUNCTION
 
FUNCTION Proc ()
PRINT " Inside loop"
END FUNCTION
 
FUNCTION Repe (func$, c)
FOR i = 1 TO c
Proc ()
NEXT i
END FUNCTION
END PROGRAM</syntaxhighlight>
{{out}}
<pre>Same as BASIC256 entry.</pre>
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">
@echo off
 
Line 156 ⟶ 602:
echo _func2 has been executed
exit /b
</syntaxhighlight>
</lang>
 
=={{header|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.
 
<syntaxhighlight lang="bqn">•Show {2+𝕩}⍟3 1
 
_repeat_ ← {(𝕘>0)◶⊢‿(𝔽_𝕣_(𝕘-1)𝔽)𝕩}
 
•Show {2+𝕩} _repeat_ 3 1</syntaxhighlight><syntaxhighlight lang="text">7
7</syntaxhighlight>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
 
void repeat(void (*f)(void), unsigned int n) {
Line 174 ⟶ 631:
return 0;
}
</syntaxhighlight>
</lang>
 
=={{header|C++ sharp|C#}}==
<lang cpp>template <typename Function>
void repeat(Function f, unsigned int n) {
for(unsigned int i=n; 0<i; i--)
f();
}</lang>
usage:
<lang cpp>#include <iostream>
void example() {
std::cout << "Example\n";
}
 
repeat(example, 4);</lang>
{{works with|C++11}}
<lang cpp> repeat([]{std::cout << "Example\n";}, 4);</lang>
=={{header|C#|C sharp}}==
{{trans|Java}}
<langsyntaxhighlight lang="csharp">using System;
 
namespace Repeat {
Line 210 ⟶ 652:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>Example 1
Example 2
Example 3</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">template <typename Function>
void repeat(Function f, unsigned int n) {
for(unsigned int i=n; 0<i; i--)
f();
}</syntaxhighlight>
usage:
<syntaxhighlight lang="cpp">#include <iostream>
void example() {
std::cout << "Example\n";
}
 
repeat(example, 4);</syntaxhighlight>
{{works with|C++11}}
<syntaxhighlight lang="cpp"> repeat([]{std::cout << "Example\n";}, 4);</syntaxhighlight>
 
=={{header|Chapel}}==
 
The most basic form, with generics.
<syntaxhighlight lang="chapel">
config const n = 5;
 
proc example()
{
writeln("example");
}
 
proc repeat(func, n)
{
for i in 0..#n do func();
}
 
repeat(example, n);
</syntaxhighlight>
 
With argument type hinting.
<syntaxhighlight lang="chapel">
config const n = 5;
 
proc example()
{
writeln("example");
}
 
proc repeat(func : proc(), n : uint)
{
for i in 0..#n do func();
}
 
repeat(example, n);
</syntaxhighlight>
 
Example of passing function which takes arguments. Chapel does not allow functions with generic arguments to be passed. First-class functions are still in development: https://chapel-lang.org/docs/technotes/firstClassProcedures.html
<syntaxhighlight lang="chapel">
config const n = 5;
 
proc example(x : uint)
{
writeln("example ", x);
}
 
proc repeat(func : proc(x : uint), n : uint)
{
for i in 0..#n do func(i);
}
 
repeat(example, n);
</syntaxhighlight>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(defn repeat-function [f n]
(dotimes [i n] (f)))</langsyntaxhighlight>
 
{{out}}
Line 227 ⟶ 738:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun repeat (f n)
(dotimes (i n) (funcall f)))
 
(repeat (lambda () (format T "Example~%")) 5)</langsyntaxhighlight>
 
=={{header|Cowgol}}==
<syntaxhighlight lang="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(); </syntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">void repeat(void function() fun, in uint times) {
foreach (immutable _; 0 .. times)
fun();
Line 245 ⟶ 781:
void main() {
repeat(&procedure, 3);
}</langsyntaxhighlight>
{{out}}
<pre>Example
Example
Example</pre>
 
=={{header|Delphi}}==
<syntaxhighlight lang="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.
 
</syntaxhighlight>
 
Alternative
 
<syntaxhighlight lang="delphi">
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.
</syntaxhighlight>
 
 
{{out}}
<pre>Hello World
Hello World
Hello World</pre>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="lisp">
(define (repeat f n) (for ((i n)) (f)))
 
Line 266 ⟶ 868:
(cos 0.7390851332151605)
→ 0.7390851332151608 ;; fixed point found
</syntaxhighlight>
</lang>
 
=={{header|F#|F sharp}}==
<langsyntaxhighlight lang="fsharp">open System
 
let Repeat c f =
Line 282 ⟶ 884:
Repeat 3 Hello
 
0 // return an integer exit code</langsyntaxhighlight>
 
=={{header|Factor}}==
Factor comes with the <tt>times</tt> word which does exactly this. For example,
<syntaxhighlight lang="factor">3 [ "Hello!" print ] times</syntaxhighlight>
<lang factor>
3 [ "Hello!" print ] times
</lang>
{{out}}
<pre>
Line 297 ⟶ 897:
 
The implementation of <tt>times</tt>:
<syntaxhighlight lang="factor">: times ( ... n quot: ( ... -- ... ) -- ... )
<lang factor>
[ drop ] prepose each-integer ; inline</syntaxhighlight>
: times ( ... n quot: ( ... -- ... ) -- ... )
 
[ drop ] prepose each-integer ; inline
=={{header|Fe}}==
</lang>
<syntaxhighlight lang="clojure">
(= repeat (mac (i n . body)
(list 'do
(list 'let i 0)
(list 'while (list '< i n)
(list '= i (list '+ i 1))
(cons 'do body)))))
 
; print multiplication table
(repeat i 10
(repeat j 10
(print i "x" j "=" (* i j)))
(print))
</syntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: times ( xt n -- )
0 ?do dup execute loop drop ;</langsyntaxhighlight>
 
Or, taking care to keep the data stack clean for the XT's use, as is often desired:
 
<langsyntaxhighlight lang="forth">: times { xt n -- }
n 0 ?do xt execute loop ;</langsyntaxhighlight>
 
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:
 
<langsyntaxhighlight lang="forth">: times[ ]] 0 ?do [[ ; immediate compile-only
: ]times postpone loop ; immediate compile-only</langsyntaxhighlight>
 
Usage:
 
<langsyntaxhighlight lang="forth">[: cr ." Hello" ;] 3 times
 
: 3-byes ( -- ) 3 times[ cr ." Bye" ]times ;
3-byes</langsyntaxhighlight>
 
{{out}}<pre>Hello
Line 331 ⟶ 945:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Sub proc()
Line 347 ⟶ 961:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 356 ⟶ 970:
4 proc called
5 proc called
</pre>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
void local fn Example( value as long )
NSLog(@"Example %ld",value)
end fn
 
void local fn DoIt( fnAddress as ptr, count as long )
def fn Repeat( j as long ) using fnAddress
long i
for i = 1 to count
fn Repeat( i )
next
end fn
 
fn DoIt( @fn Example, 3 )
 
HandleEvents
</syntaxhighlight>
 
{{out}}
<pre>
Example 1
Example 2
Example 3
</pre>
 
=={{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.
<syntaxhighlight lang="gambas">
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</syntaxhighlight>
Output:
<pre>
RepeatableOne
RepeatableOne
RepeatableTwo
RepeatableTwo
RepeatableTwo
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 375 ⟶ 1,058:
func main() {
repeat(4, fn)
}</langsyntaxhighlight>
 
=={{header|Haskell}}==
Such a function already exists
<langsyntaxhighlight Haskelllang="haskell">import Control.Monad (replicateM_)
 
sampleFunction :: IO ()
sampleFunction = putStrLn "a"
 
main = replicateM_ 5 sampleFunction</langsyntaxhighlight>
 
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:
<langsyntaxhighlight Haskelllang="haskell">applyN :: Int -> (a -> a) -> a -> a
applyN n f = foldr (.) id (replicate n f)
 
main :: IO ()
main = print $ applyN 10 (\x -> 2 * x) 1</langsyntaxhighlight>
{{Out}}
<pre>1024</pre>
 
=={{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.
<syntaxhighlight lang="isabelle">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</syntaxhighlight>
 
=={{header|J}}==
<syntaxhighlight lang="j">
<lang J>
NB. ^: (J's power conjunction) repeatedly evaluates a verb.
 
Line 450 ⟶ 1,191:
hi
hi
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
There are two ways to achieve this, one way is through ''reflection''.
<syntaxhighlight lang="java">
import java.lang.reflect.Method;
 
public class Program {
public static void main(String[] args) throws ReflectiveOperationException {
Method method = Program.class.getMethod("printRosettaCode");
repeat(method, 5);
}
 
public static void printRosettaCode() {
System.out.println("Rosetta Code");
}
 
public static void repeat(Method method, int count) throws ReflectiveOperationException {
while (count-- > 0)
method.invoke(null);
}
}</syntaxhighlight>
<pre>
Rosetta Code
Rosetta Code
Rosetta Code
Rosetta Code
Rosetta Code
</pre>
<br />
Or
{{works with|Java|8}}
<langsyntaxhighlight lang="java">import java.util.function.Consumer;
import java.util.stream.IntStream;
 
Line 466 ⟶ 1,235:
IntStream.range(0, n).forEach(i -> fun.accept(i + 1));
}
}</langsyntaxhighlight>
 
Output:
Line 473 ⟶ 1,242:
Example 2
Example 3</pre>
 
=={{header|jq}}==
{{works with|jq|1.4}}
Line 487 ⟶ 1,257:
 
'''Unoptimized version''':
<langsyntaxhighlight lang="jq">def unoptimized_repeat(f; n):
if n <= 0 then empty
else f, repeat(f; n-1)
end;</langsyntaxhighlight>
 
'''Optimized for TCO''':
<langsyntaxhighlight lang="jq">def repeat(f; n):
# state: [count, in]
def r:
if .[0] >= n then empty else (.[1] | f), (.[0] += 1 | r) end;
[0, .] | r;</langsyntaxhighlight>
'''Variant''':
<langsyntaxhighlight lang="jq"># 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):
Line 507 ⟶ 1,277:
else .[1], ([.[0] - 1, (.[1] | f)] | r)
end;
[n, .] | r;</langsyntaxhighlight>
 
'''Examples''':
<langsyntaxhighlight lang="jq">0 | [ repeat(.+1; 3) ]</langsyntaxhighlight>
produces:
[1,1,1]
<langsyntaxhighlight lang="jq">0 | repeatedly(.+1; 3)</langsyntaxhighlight>
produces:
0
Line 521 ⟶ 1,291:
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">function sayHi()
println("Hi")
end
Line 529 ⟶ 1,299:
end
 
rep(sayHi, 3)</langsyntaxhighlight>
{{out}}
<pre>Hi
Line 536 ⟶ 1,306:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
fun repeat(n: Int, f: () -> Unit) {
Line 547 ⟶ 1,317:
fun main(args: Array<String>) {
repeat(5) { print("Example ") }
}</langsyntaxhighlight>
 
{{out}}
Line 556 ⟶ 1,326:
Example 4
Example 5
</pre>
 
=={{header|Lean}}==
 
===Lean 3.4.2===
<syntaxhighlight lang="lean">
def repeat : ℕ → (ℕ → string) → string
| 0 f := "done"
| (n + 1) f := (f n) ++ (repeat n f)
 
 
#eval repeat 5 $ λ b : ℕ , "me "
</syntaxhighlight>
 
{{out}}
<pre>
"me me me me me done"
</pre>
 
===Lean 4===
<syntaxhighlight lang="lean">
def repeatf (f : Nat -> String) (n : Nat) : String :=
match n with
| 0 => "."
| (k + 1) => (f k) ++ (repeatf f k)
 
def example1 : String :=
repeatf (fun (x : Nat) => toString (x) ++ " ") (10)
 
#eval example1
</syntaxhighlight>
 
{{out}}
<pre>
"9 8 7 6 5 4 3 2 1 0 ."
</pre>
 
=={{header|LiveCode}}==
<langsyntaxhighlight LiveCodelang="livecode">rep "answer",3
 
command rep x,n
Line 565 ⟶ 1,370:
do merge("[[x]] [[n]]")
end repeat
end rep</langsyntaxhighlight>
 
=={{header|Lua}}==
No particular magic required as Lua allows functions to be passed as arguments.
<langsyntaxhighlight Lualang="lua">function myFunc ()
print("Sure looks like a function in here...")
end
Line 580 ⟶ 1,385:
 
rep(myFunc, 4)
</syntaxhighlight>
</lang>
{{out}}
<pre>Sure looks like a function in here...
Line 587 ⟶ 1,392:
Sure looks like a function in here...</pre>
 
=={{header|MathematicaMastermind}}==
Functions are in-lined at compile time in [[Mastermind]], meaning the "repeat" function cannot accept another procedure as an argument. This is due to limitations of the compilation target, which is [[Brainf***]]. Dynamically calling functions would require creating a function runtime.
<syntaxhighlight lang="mastermind">def do_something<number> {
output "Letter: ";
output 'a' + number;
output '\n';
}
 
def repeat<times> {
let i = 0;
drain times into i {
do_something<i>;
}
}
 
let repetitions = 8;
repeat<repetitions>;</syntaxhighlight>
{{out}}
<pre>Letter: a
Letter: b
Letter: c
Letter: d
Letter: e
Letter: f
Letter: g
Letter: h
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Note that anything of this form is not considered good practice.
<langsyntaxhighlight Mathematicalang="mathematica">repeat[f_, n_] := Do[f[], {n}];
repeat[Print["Hello, world!"] &, 5];</langsyntaxhighlight>
{{out}}
<pre>Hello, world!
Line 598 ⟶ 1,431:
Hello, world!</pre>
 
=={{header|МК-61/52min}}==
This operator already exists in min and is called <code>times</code>.
 
{{works with|min|0.19.6}}
<lang>1 П4
<syntaxhighlight lang="min">("Hello" puts!) 3 times</syntaxhighlight>
 
{{out}}
3 ^ 1 6 ПП 09 С/П
<pre>
 
Hello
П7 <-> П0 КПП7 L0 12 В/О
Hello
 
Hello
ИП4 С/П КИП4 В/О</lang>
</pre>
 
=={{header|MiniScript}}==
 
<langsyntaxhighlight MiniScriptlang="miniscript">sayHi = function()
print "Hi!"
end function
Line 620 ⟶ 1,454:
end function
 
rep @sayHi, 3</langsyntaxhighlight>
{{out}}
<pre>Hi!
Hi!
Hi!</pre>
 
=={{header|МК-61/52}}==
 
<syntaxhighlight lang="text">1 П4
 
3 ^ 1 6 ПП 09 С/П
 
П7 <-> П0 КПП7 L0 12 В/О
 
ИП4 С/П КИП4 В/О</syntaxhighlight>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE Repeat;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
 
Line 650 ⟶ 1,494:
 
ReadChar
END Repeat.</langsyntaxhighlight>
 
=={{header|Nanoquery}}==
{{trans|Python}}
<syntaxhighlight lang="nanoquery">def repeat(f,n)
for i in range(1, n)
f()
end
end
 
def procedure()
println "Example"
end
 
repeat(procedure, 3)</syntaxhighlight>
 
=={{header|Nim}}==
<syntaxhighlight lang="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()
</syntaxhighlight>
 
=={{header|Objeck}}==
 
<langsyntaxhighlight lang="objeck">class Repeat {
function : Main(args : String[]) ~ Nil {
Repeat(Example() ~ Nil, 3);
Line 668 ⟶ 1,563:
"Example"->PrintLine();
}
}</langsyntaxhighlight>
 
=={{header|OCaml}}==
 
<langsyntaxhighlight lang="ocaml">let repeat ~f ~n =
for i = 1 to n do
f ()
Line 682 ⟶ 1,577:
let () =
repeat ~n:4 ~f:func
</syntaxhighlight>
</lang>
 
=={{header|Oforth}}==
Line 688 ⟶ 1,583:
This method is already defined : times. This method can be used on all runnables (functions, methods, blocks, ...).
 
<langsyntaxhighlight Oforthlang="oforth">: hello "Hello, World!" println ;
10 #hello times</langsyntaxhighlight>
 
{{out}}
Line 706 ⟶ 1,601:
 
=={{header|Ol}}==
<langsyntaxhighlight lang="scheme">
; sample function
(define (function) (display "+"))
Line 723 ⟶ 1,618:
(print) ; print newline
; ==> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
</syntaxhighlight>
</lang>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">repeat(f, n)=for(i=1,n,f());
repeat( ()->print("Hi!"), 2);</langsyntaxhighlight>
{{out}}
<pre>Hi!
Hi!</pre>
=={{header|Pascal}}==
<syntaxhighlight lang="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. </syntaxhighlight>
{{out}}
<pre>Iteration 1
Iteration 2
Iteration 3</pre>
 
=={{header|Perl}}==
Line 736 ⟶ 1,657:
{{trans|C}}
 
<langsyntaxhighlight lang="perl">sub repeat {
my ($sub, $n) = @_;
$sub->() for 1..$n;
Line 745 ⟶ 1,666:
}
 
repeat(\&example, 4);</langsyntaxhighlight>
 
=={{header|Perl 6}}==
 
<lang perl6>sub repeat (&f, $n) { f() xx $n };
 
sub example { say rand }
 
repeat(&example, 3);</lang>
 
{{Output}}
<pre>
0.435249779778396
0.647701200726486
0.279289335968417
</pre>
 
Of course, we could have just written <pre style="display:inline; padding:0.3em">example() xx 3;</pre> or even <pre style="display:inline; padding:0.3em">(say rand) xx 3;</pre> directly &ndash; the custom <code>repeat</code> subroutine is just here to satisfy the task description.
 
Notes on the [http://doc.perl6.org/language/operators#infix_xx <code>xx</code>] operator:
 
* Unlike other operators, it evaluates its left-hand-side argument lazily - that's why we can simply call <code>f()</code> 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 <code>xx</code> is usually used for)''.
 
General notes:
* The <code>&</code> sigil in the <code>repeat</code> subroutine signature restricts that parameter to types that implement the <code>Callable</code> role, and makes it available inside the <code>repeat</code> 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 <code>repeat { ... } while ...</code> construct.
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">-->
<lang Phix>procedure Repeat(integer rid, integer n)
<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>
for i=1 to n do
<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>
call_proc(rid,{})
<span style="color: #000000;">rid</span><span style="color: #0000FF;">()</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Hello</span><span style="color: #0000FF;">()</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"Hello"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</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>
<!--</syntaxhighlight>-->
 
=={{header|Phixmonti}}==
procedure Hello()
<syntaxhighlight lang="phixmonti">def myFunc
?"Hello"
"Sure looks like a function in here..." print nl
end procedure
enddef
def rep /# func times -- #/
for drop
dup exec
endfor
drop
enddef
 
getid myFunc 4 rep
Repeat(routine_id("Hello"),5)</lang>
</syntaxhighlight>
 
=={{header|PicoLisp}}==
 
<langsyntaxhighlight PicoLisplang="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.
Line 799 ⟶ 1,711:
(do N (Fn)) )
 
(dofn version 10)</langsyntaxhighlight>
 
=={{header|PowerShell}}==
{{trans|Python}} (Made more PowerShelly.)
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Out-Example
{
Line 818 ⟶ 1,730:
 
Step-Function Out-Example -Repeat 3
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 828 ⟶ 1,740:
=={{header|Prolog}}==
 
<langsyntaxhighlight lang="prolog">repeat(_, 0).
repeat(Callable, Times) :-
succ(TimesLess1, Times),
Line 835 ⟶ 1,747:
 
test :- write('Hello, World'), nl.
test(Name) :- format('Hello, ~w~n', Name).</langsyntaxhighlight>
{{out}}
<pre>
Line 852 ⟶ 1,764:
false.
</pre>
 
=={{header|PureBasic}}==
<syntaxhighlight lang="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)</syntaxhighlight>
{{out}}
<pre>Quark 3
Quark 2
Quark 1</pre>
 
=={{header|Python}}==
 
===Procedural===
<langsyntaxhighlight Pythonlang="python">#!/usr/bin/python
def repeat(f,n):
for i in range(n):
Line 864 ⟶ 1,793:
print("Example");
 
repeat(procedure,3); #prints "Example" (without quotes) three times, separated by newlines.</langsyntaxhighlight>
 
===Functional===
Repeated function application:
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Application of a given function, repeated N times'''
 
from itertools import repeat
Line 967 ⟶ 1,896:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>Application of a given function, repeated N times:
Line 986 ⟶ 1,915:
(def h(x):
return 1.05 * x)(100) -> 115.7625</pre>
 
=={{header|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.
 
<syntaxhighlight lang="quackery"> [ 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 --> )</syntaxhighlight>
 
{{Out}}
''rosetta-times'' demonstrated in the Quackery shell. (REPL)
<pre>/O> [ say "hello" cr ] is hi
... 5 ' hi rosetta-times
...
hello
hello
hello
hello
hello
 
Stack empty.</pre>
 
=={{header|R}}==
<syntaxhighlight lang="r">
<lang R>
f1 <- function(...){print("coucou")}
 
Line 996 ⟶ 1,978:
 
f2(f1,4)
</syntaxhighlight>
</lang>
 
=={{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!
 
<langsyntaxhighlight Racketlang="racket">#lang racket/base
(define (repeat f n) ; the for loop is idiomatic of (although not exclusive to) racket
(for ((_ n)) (f)))
Line 1,012 ⟶ 1,994:
(display "...")
(repeat2 (λ () (display " & over")) 5)
(newline)</langsyntaxhighlight>
{{out}}
<pre>... and over and over and over and over and over... & over & over & over & over & over</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
 
<syntaxhighlight lang="raku" line>sub repeat (&f, $n) { f() xx $n };
 
sub example { say rand }
 
repeat(&example, 3);</syntaxhighlight>
 
{{Out}}
<pre>
0.435249779778396
0.647701200726486
0.279289335968417
</pre>
 
Of course, we could have just written <pre style="display:inline; padding:0.3em">example() xx 3;</pre> or even <pre style="display:inline; padding:0.3em">(say rand) xx 3;</pre> directly &ndash; the custom <code>repeat</code> subroutine is just here to satisfy the task description.
 
Notes on the [http://doc.raku.org/language/operators#infix_xx <code>xx</code>] operator:
 
* Unlike other operators, it evaluates its left-hand-side argument lazily - that's why we can simply call <code>f()</code> 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 <code>xx</code> is usually used for)''.
 
General notes:
* The <code>&</code> sigil in the <code>repeat</code> subroutine signature restricts that parameter to types that implement the <code>Callable</code> role, and makes it available inside the <code>repeat</code> 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 <code>repeat { ... } while ...</code> construct.
 
=={{header|Red}}==
<syntaxhighlight lang="rebol">Red[]
 
myrepeat: function [fn n] [loop n [do fn]]
 
myrepeat [print "hello"] 3</syntaxhighlight>
{{out}}
<pre>
hello
hello
hello
</pre>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
= <Prout <Repeat 3 Example> Eggs And <Example>>;
}
 
Repeat {
0 s.F e.X = e.X;
s.N s.F e.X = <Repeat <- s.N 1> s.F <Mu s.F e.X>>;
};
 
Example {
e.X = e.X Spam;
};</syntaxhighlight>
{{out}}
<pre>Spam Spam Spam Eggs And Spam</pre>
 
=={{header|REXX}}==
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.
<langsyntaxhighlight lang="rexx">/*REXX program executes a named procedure a specified number of times. */
parse arg pN # . /*obtain optional arguments from the CL*/
if #=='' | #=="," then #=1 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*/
Line 1,029 ⟶ 2,067:
return /*return to invoker of the REPEATS proc*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
yabba: say 'Yabba, yabba do!'; return /*simple code; no need for PROCEDURE.*/</langsyntaxhighlight>
'''{{out|output'''|text=&nbsp; when using the input isof: &nbsp; &nbsp; <tt> yabba &nbsp; 4 </tt>}}
<pre>
Yabba, yabba do!
Line 1,047 ⟶ 2,085:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
Func Main
times(5,:test)
Line 1,058 ⟶ 2,096:
Call F()
next
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
≪ → func n
≪ 1 n '''START''' func EVAL '''NEXT'''
≫ ≫ '<span style="color:blue>TIMES</span>' STO
≪ " world" "Hello" SWAP + ≫ 3 <span style="color:blue>TIMES</span>
{{out}}
<pre>
3: "Hello world"
2: "Hello world"
1: "Hello world"
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">4.times{ puts "Example" } # idiomatic way
 
def repeat(proc,num)
Line 1,067 ⟶ 2,118:
end
 
repeat(->{ puts "Example" }, 4)</langsyntaxhighlight>
 
=={{header|Rust}}==
 
<lang rust>// Repeat the function f, n times.
Rust has higher-order functions.
fn repeat<F>(f: &F, n: u32)
 
where F: Fn() {
<syntaxhighlight lang="rust">fn repeat(f: impl FnMut(usize), n: usize) {
for _ in 0..n {
f(0..n).for_each(f);
}</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.
 
=== Closure ===
 
It's idiomatic to use a closure.
 
<syntaxhighlight lang="rust">fn main() {
repeat(|x| print!("{};", x), 5);
}</syntaxhighlight>
{{out}}<pre>0;1;2;3;4;</pre>
 
=== Static Function ===
 
Also possible to define a static function.
 
<syntaxhighlight lang="rust">fn function(x: usize) {
print!("{};", x);
}
 
fn main() {
repeat(function, 4);
}</syntaxhighlight>
 
{{out}}<pre>0;1;2;3;</pre>
 
=== Static Method ===
 
Sometimes it may be convenient to call a static method.
 
<syntaxhighlight lang="rust">struct Foo;
impl Foo {
fn associated(x: usize) {
print!("{};", x);
}
}
 
fn static_fnmain() {
print!repeat("StaticFoo::associated, "8);
}</syntaxhighlight>
{{out}}<pre>0;1;2;3;4;5;6;7;</pre>
 
=== Trait Method ===
 
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>.
 
<syntaxhighlight lang="rust">trait Bar {
fn run(self);
}
 
impl Bar for usize {
fn run(self) {
print!("{};", self);
}
}
 
fn main() {
repeat(Bar::run, 6);
// Repeat a static function.
}</syntaxhighlight>
repeat(&static_fn, 4);
{{out}}<pre>0;1;2;3;4;5;</pre>
 
=== Mutable Closure ===
println!("");
 
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.
// Repeat an anonymous closure.
 
repeat(&|| print!("Closure "), 5);
<syntaxhighlight lang="rust">fn repeat(f: impl FnMut(usize), n: usize) {
}</lang>
(0..n).for_each(f);
{{out}}
}
<pre>Static Static Static Static
 
Closure Closure Closure Closure Closure</pre>
fn main() {
let mut mult = 1;
repeat(|x| {
print!("{};", x * mult);
mult += x;
}, 5);
}</syntaxhighlight>
{{out}}<pre>0;1;4;12;28;</pre>
 
=={{header|Scala}}==
Line 1,100 ⟶ 2,210:
# Type parameterization
# Higher order function
<langsyntaxhighlight lang="scala"> def repeat[A](n:Int)(f: => A)= ( 0 until n).foreach(_ => f)
 
repeat(3) { println("Example") }</langsyntaxhighlight>
===Advanced Scala-ish ===
# Call by name
Line 1,109 ⟶ 2,219:
# Tail recursion
# Infix notation
<langsyntaxhighlight lang="scala">object Repeat2 extends App {
implicit class IntWithTimes(x: Int) {
Line 1,124 ⟶ 2,234:
 
5 times println("ha") // Not recommended infix for 5.times(println("ha")) aka dot notation
}</langsyntaxhighlight>
 
===Most Scala-ish ===
Line 1,133 ⟶ 2,243:
# Infix notation
# Operator overloading
<langsyntaxhighlight lang="scala">import scala.annotation.tailrec
 
object Repeat3 extends App {
Line 1,150 ⟶ 2,260:
 
print("ha") * 5 // * is the method, effective should be A.*(5)
}</langsyntaxhighlight>
 
=={{header|Scheme}}==
Line 1,157 ⟶ 2,267:
an unspecified value. The actual value returned varies depending on the Scheme implementation itself.
 
<langsyntaxhighlight lang="scheme">
(import (scheme base)
(scheme write))
Line 1,171 ⟶ 2,281:
;; example returning a number
(display (repeat (lambda () (+ 1 2)) 5)) (newline)
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,183 ⟶ 2,293:
(#<undef> #<undef> #<undef> #<undef>)
(3 3 3 3 3)
</pre>
 
=={{header|Seed7}}==
<syntaxhighlight lang="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;</syntaxhighlight>
{{out}}
<pre>
Hello!
Hello!
Hello!
</pre>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func repeat(f, n) {
{ f() } * n;
}
Line 1,194 ⟶ 2,327:
}
 
repeat(example, 4);</langsyntaxhighlight>
 
=={{header|Standard ML}}==
<syntaxhighlight lang="sml">fun repeat (_, 0) = ()
| repeat (f, n) = (f (); repeat (f, n - 1))
 
fun testProcedure () =
print "test\n"
 
val () = repeat (testProcedure, 5)</syntaxhighlight>
 
=={{header|Stata}}==
 
<langsyntaxhighlight lang="stata">function repeat(f,n) {
for (i=1; i<=n; i++) (*f)()
}
Line 1,206 ⟶ 2,348:
}
 
repeat(&hello(),3)</langsyntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">func repeat(n: Int, f: () -> ()) {
for _ in 0..<n {
f()
Line 1,215 ⟶ 2,357:
}
 
repeat(4) { println("Example") }</langsyntaxhighlight>
 
=={{header|Tcl}}==
The usual way of doing a repeat would be:
<langsyntaxhighlight lang="tcl">proc repeat {command count} {
for {set i 0} {$i < $count} {incr i} {
uplevel 1 $command
Line 1,226 ⟶ 2,368:
 
proc example {} {puts "This is an example"}
repeat example 4</langsyntaxhighlight>
However, the <code>time</code> command can be used as long as the return value (the report on the timing information) is ignored.
<syntaxhighlight lang ="tcl">time example 4</langsyntaxhighlight>
It should be noted that the “command” can be an arbitrary script, not just a call to a procedure:
<langsyntaxhighlight lang="tcl">repeat {puts "hello world"} 3</langsyntaxhighlight>
 
=={{header|uBasic/4tH}}==
<syntaxhighlight lang="text">Proc _Repeat (_HelloWorld, 5) : End
 
_Repeat Param (2) : Local (1) : For c@ = 1 To b@ : Proc a@ : Next : Return
_HelloWorld Print "Hello world!" : Return</syntaxhighlight>
Output:
<pre>
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
 
0 OK, 0:35
</pre>
 
=={{header|Ursa}}==
<langsyntaxhighlight lang="ursa">def repeat (function f, int n)
for (set n n) (> n 0) (dec n)
f
Line 1,244 ⟶ 2,402:
 
# outputs "Hello! " 5 times
repeat procedure 5</langsyntaxhighlight>
 
=={{header|VBA}}==
{{trans|Phix}}<langsyntaxhighlight lang="vb">Private Sub Repeat(rid As String, n As Integer)
For i = 1 To n
Application.Run rid
Line 1,259 ⟶ 2,417:
Public Sub main()
Repeat "Hello", 5
End Sub</langsyntaxhighlight>
 
=={{header|Verilog}}==
<syntaxhighlight lang="verilog">module main;
initial begin
repeat(5) begin
$display("Inside loop");
end
$display("Loop Ended");
end
endmodule</syntaxhighlight>
{{out}}
<pre>Inside loop
Inside loop
Inside loop
Inside loop
Inside loop
Loop Ended</pre>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Module Module1
 
Sub Repeat(count As Integer, fn As Action(Of Integer))
Line 1,278 ⟶ 2,454:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>Example 1
Example 2
Example 3</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn repeat(n int, f fn()) {
for _ in 0.. n {
f()
}
}
fn func() {
println("Example")
}
fn main() {
repeat(4, func)
}</syntaxhighlight>
{{out}}
<pre>Example
Example
Example
Example
</pre>
 
=={{header|Wren}}==
<syntaxhighlight lang="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)</syntaxhighlight>
 
{{out}}
<pre>
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
</pre>
 
=={{header|XBS}}==
XBS has a built-in repeat keyword.
<syntaxhighlight lang="xbs">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);</syntaxhighlight>
{{out}}
<pre>
6
6
6
</pre>
 
=={{header|XLISP}}==
<langsyntaxhighlight lang="lisp">(defun repeat (f n)
(f)
(if (> n 1)
Line 1,291 ⟶ 2,527:
 
;; an example to test it:
(repeat (lambda () (print '(hello rosetta code))) 5)</langsyntaxhighlight>
{{out}}
<pre>(HELLO ROSETTA CODE)
Line 1,301 ⟶ 2,537:
=={{header|Yabasic}}==
{{trans|Lua}}
<langsyntaxhighlight Yabasiclang="yabasic">sub myFunc ()
print "Sure looks like a function in here..."
end sub
Line 1,311 ⟶ 2,547:
end sub
rep("myFunc", 4)</langsyntaxhighlight>
=={{header|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.
 
<syntaxhighlight lang="z80">
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
</syntaxhighlight>
=== Indirect Jump ===
 
Same as above but uses an indirect jump to the address in HL.
<syntaxhighlight lang="z80">trampoline:
jp (hl) ;despite the parentheses this does NOT dereference HL, it merely acts as "LD PC,HL".</syntaxhighlight>
 
===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.
<syntaxhighlight lang="z80">
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>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn repeat(f,n){ do(n){ f() } }
repeat("ho ".print,3);</langsyntaxhighlight>
{{out}}<pre>ho ho ho </pre>
6

edits