Loops/Do-while: Difference between revisions

Content deleted Content added
Loren (talk | contribs)
Add XPL0
Chkas (talk | contribs)
 
(269 intermediate revisions by more than 100 users not shown)
Line 1:
{{task|Iteration}} [[Category:Conditional loops]]
[[Category:Conditional loops]]
Start with a value at 0. Loop while value mod 6 is not equal to 0. Each time through the loop, add 1 to the value then print it. The loop must execute at least once.
[[Category:Simple]]
 
Start with a value at 0. Loop while value mod 6 is not equal to 0.
Each time through the loop, add 1 to the value then print it.
The loop must execute at least once.
 
 
;Related tasks:
*   [[Loop over multiple arrays simultaneously]]
*   [[Loops/Break]]
*   [[Loops/Continue]]
*   [[Loops/Do-while]]
*   [[Loops/Downward for]]
*   [[Loops/For]]
*   [[Loops/For with a specified step]]
*   [[Loops/Foreach]]
*   [[Loops/Increment loop index within loop body]]
*   [[Loops/Infinite]]
*   [[Loops/N plus one half]]
*   [[Loops/Nested]]
*   [[Loops/While]]
*   [[Loops/with multiple ranges]]
*   [[Loops/Wrong ranges]]
 
 
;Reference:
* [[wp:Do while loop|Do while loop]] Wikipedia.
<br><br>
 
=={{header|11l}}==
11l doesn't have a do-while loop.
{{trans|Python}}
 
<syntaxhighlight lang="11l">V val = 0
L
val++
print(val)
I val % 6 == 0
L.break</syntaxhighlight>
 
=={{header|360 Assembly}}==
;Basic
The WTO macro is in SYS1.MACLIB, which needs to be in the SYSLIB concatenation at assembly.
<syntaxhighlight lang="360asm">* Do-While
DOWHILE CSECT , This program's control section
BAKR 14,0 Caller's registers to linkage stack
LR 12,15 load entry point address into Reg 12
USING DOWHILE,12 tell assembler we use Reg 12 as base
XR 9,9 clear Reg 9 - divident value
LA 6,6 load divisor value 6 in Reg 6
LA 8,WTOLEN address of WTO area in Reg 8
LOOP DS 0H
LA 9,1(,9) add 1 to divident Reg 9
ST 9,FW2 store it
LM 4,5,FDOUBLE load into even/odd register pair
STH 9,WTOTXT store divident in text area
MVI WTOTXT,X'F0' first of two bytes zero
OI WTOTXT+1,X'F0' make second byte printable
WTO TEXT=(8) print it (Write To Operator macro)
DR 4,6 divide Reg pair 4,5 by Reg 6
LTR 5,5 test quotient (remainder in Reg 4)
BNZ RETURN if one: 6 iterations, exit loop.
B LOOP if zero: loop again.
RETURN PR , return to caller.
FDOUBLE DC 0FD
DC F'0'
FW2 DC F'0'
WTOLEN DC H'2' fixed WTO length of two
WTOTXT DC CL2' '
END DOWHILE </syntaxhighlight>
;Structured Macros
Although specified at the beginning (DO UNTIL), the test is done at the end of the loop (ENDDO).
Structured macros (DO ENDDO) weren't in the 1963 standard of Assembler 360, but there are part of it since since 1998.
<syntaxhighlight lang="360asm">* Do-While 27/06/2016
DOWHILE CSECT
USING DOWHILE,12 set base register
LR 12,15 init base register
SR 6,6 v=0
LA 4,1 init reg 4
DO UNTIL=(LTR,4,Z,4) do until v mod 6=0
LA 6,1(6) v=v+1
STC 6,WTOTXT v
OI WTOTXT,X'F0' make editable
WTO MF=(E,WTOMSG) display v
LR 4,6 v
SRDA 4,32 shift dividend to reg 5
D 4,=F'6' v/6 so r4=remain & r5=quotient
ENDDO , end do
BR 14 return to caller
WTOMSG DS 0F full word alignment for wto
WTOLEN DC AL2(L'WTOTXT+4) length of WTO buffer
DC H'0' must be zero
WTOTXT DS C one char
END DOWHILE</syntaxhighlight>
 
=={{header|6502 Assembly}}==
Code is called as a subroutine (i.e. JSR DoWhileSub). Specific OS/hardware routines for printing are left unimplemented.
<langsyntaxhighlight lang="6502asm">DoWhileSub: PHA
TYA
PHA ;push accumulator and Y register onto stack
Line 21 ⟶ 115:
TAY
PLA ;restore Y register and accumulator from stack
RTS ;return from subroutine</langsyntaxhighlight>
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program loopdowhile64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .asciz "Counter = @ \n" // message result
 
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
mov x20,0 // indice
mov x21,6
1: // begin loop
mov x0,x20
ldr x1,qAdrsZoneConv // conversion value value
bl conversion10 // decimal
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv // display conversion
bl strInsertAtCharInc // insert result at @ character
bl affichageMess // display message
add x20,x20,1 // increment counter
udiv x0,x20,x21 // divide by 6
msub x1,x0,x21,x20 // compute remainder
cbnz x1,1b // loop if remainder <> zéro
100: // standard end of the program
mov x0,0 // return code
mov x8,EXIT // request to exit program
svc 0 // perform the system call
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
 
</syntaxhighlight>
 
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">Proc Main()
byte A
 
A=0
Do
A==+1
PrintBE(A)
Until A Mod 6=0
Od
Return</syntaxhighlight>
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">var val:int = 0;
do
{
trace(++val);
} while (val % 6);</langsyntaxhighlight>
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">loop
Value := Value + 1;
Put (Value);
exit when Value mod 6 = 0;
end loop;</langsyntaxhighlight>
Here is an alternative version:
<langsyntaxhighlight lang="ada">for Value in 0..Integer'Last loop
Put (Value);
exit when Value mod 6 = 0;
end loop;</langsyntaxhighlight>
 
=={{header|Agena}}==
Tested with Agena 2.9.5 Win32
<syntaxhighlight lang="agena">scope
local i := 0;
do
inc i, 1;
print( i )
as ( i % 6 ) <> 0
epocs</syntaxhighlight>
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">integer a;
 
a = 0;
Line 49 ⟶ 225:
o_integer(a);
o_byte('\n');
} while (a % 6 != 0);</langsyntaxhighlight>
 
=={{header|ALGOL 60}}==
{{works with|ALGOL 60|OS/360}}
No structured control instructions in Algol 60 to perform this task. Use of 2 harmful GOTOs. I agree Edsger Dijkstra communication "Go To Statement Considered Harmful", ACM 1968.
<syntaxhighlight lang="algol60">'BEGIN' 'COMMENT' Loops DoWhile - Algol60 - 22/06/2018;
'INTEGER' I;
I:=0;
LOOP:
I:=I+1;
OUTINTEGER(1,I);
'IF' I=I'/'6*6 'THEN' 'GOTO' ENDLOOP;
'GOTO' LOOP;
ENDLOOP:
'END'</syntaxhighlight>
{{out}}
<pre>
+1 +2 +3 +4 +5 +6
</pre>
 
===A "goto-less" approach===
{{works with|A60}}
While a judicious "goto" may sometimes be clearer than the alternative, it is possible to avoid it in this case by using the for-while statement and a boolean flag to implement a test-at-the-bottom loop.
<syntaxhighlight lang="algol60">
begin
 
integer i;
boolean another;
i := 0;
another := true;
for i := i while another do
begin
i := i + 1;
outinteger(1,i);
comment - stop once i mod 6 = 0;
if i = (i div 6) * 6 then another := false;
end;
 
end
</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 5 6
</pre>
 
=={{header|ALGOL 68}}==
<langsyntaxhighlight lang="algol68">FOR value WHILE
print(value);
# WHILE # value MOD 6 /= 0 DO
SKIP
OD</langsyntaxhighlight>
 
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
integer i;
i := 0;
while
begin
i := i + 1;
write( i );
( i rem 6 ) not = 0
end
do begin end
end.</syntaxhighlight>
 
=={{header|AmigaE}}==
<langsyntaxhighlight lang="amigae">PROC main()
DEF i = 0
REPEAT
Line 65 ⟶ 297:
WriteF('\d\n', i)
UNTIL Mod(i, 6) = 0
ENDPROC</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
 
/* ARM assembly Raspberry PI */
/* program loopdowhile.s */
 
/* Constantes */
.equ STDOUT, 1 @ Linux output console
.equ EXIT, 1 @ Linux syscall
.equ WRITE, 4 @ Linux syscall
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .ascii "Counter = " @ message result
sMessValeur: .fill 12, 1, ' '
.asciz "\n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
push {fp,lr} @ saves 2 registers
mov r4,#0
1: @ begin loop
mov r0,r4
 
ldr r1,iAdrsMessValeur @ display value
bl conversion10 @ call function with 2 parameter (r0,r1)
ldr r0,iAdrszMessResult
bl affichageMess @ display message
add r4,#1 @ increment counter
mov r0,r4
mov r1,#6 @ division conuter by 6
bl division
cmp r3,#0 @ remainder = zéro ?
bne 1b @ no ->begin loop one
 
100: @ standard end of the program
mov r0, #0 @ return code
pop {fp,lr} @restaur 2 registers
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
 
iAdrsMessValeur: .int sMessValeur
iAdrszMessResult: .int szMessResult
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {r0,r1,r2,r7,lr} @ save registres
mov r2,#0 @ counter length
1: @ loop length calculation
ldrb r1,[r0,r2] @ read octet start position + index
cmp r1,#0 @ if 0 its over
addne r2,r2,#1 @ else add 1 in the length
bne 1b @ and loop
@ so here r2 contains the length of the message
mov r1,r0 @ address message in r1
mov r0,#STDOUT @ code to write to the standard output Linux
mov r7, #WRITE @ code call system "write"
svc #0 @ call systeme
pop {r0,r1,r2,r7,lr} @ restaur des 2 registres */
bx lr @ return
/******************************************************************/
/* Converting a register to a decimal */
/******************************************************************/
/* r0 contains value and r1 address area */
conversion10:
push {r1-r4,lr} @ save registers
mov r3,r1
mov r2,#10
 
1: @ start loop
bl divisionpar10 @ r0 <- dividende. quotient ->r0 reste -> r1
add r1,#48 @ digit
strb r1,[r3,r2] @ store digit on area
sub r2,#1 @ previous position
cmp r0,#0 @ stop if quotient = 0 */
bne 1b @ else loop
@ and move spaces in first on area
mov r1,#' ' @ space
2:
strb r1,[r3,r2] @ store space in area
subs r2,#1 @ @ previous position
bge 2b @ loop if r2 >= zéro
 
100:
pop {r1-r4,lr} @ restaur registres
bx lr @return
/***************************************************/
/* division par 10 signé */
/* Thanks to http://thinkingeek.com/arm-assembler-raspberry-pi/*
/* and http://www.hackersdelight.org/ */
/***************************************************/
/* r0 dividende */
/* r0 quotient */
/* r1 remainder */
divisionpar10:
/* r0 contains the argument to be divided by 10 */
push {r2-r4} /* save registers */
mov r4,r0
mov r3,#0x6667 @ r3 <- magic_number lower
movt r3,#0x6666 @ r3 <- magic_number upper
smull r1, r2, r3, r0 @ r1 <- Lower32Bits(r1*r0). r2 <- Upper32Bits(r1*r0)
mov r2, r2, ASR #2 /* r2 <- r2 >> 2 */
mov r1, r0, LSR #31 /* r1 <- r0 >> 31 */
add r0, r2, r1 /* r0 <- r2 + r1 */
add r2,r0,r0, lsl #2 /* r2 <- r0 * 5 */
sub r1,r4,r2, lsl #1 /* r1 <- r4 - (r2 * 2) = r4 - (r0 * 10) */
pop {r2-r4}
bx lr /* leave function */
/***************************************************/
/* integer division unsigned */
/***************************************************/
division:
/* r0 contains dividend */
/* r1 contains divisor */
/* r2 returns quotient */
/* r3 returns remainder */
push {r4, lr}
mov r2, #0 @ init quotient
mov r3, #0 @ init remainder
mov r4, #32 @ init counter bits
b 2f
1: @ loop
movs r0, r0, LSL #1 @ r0 <- r0 << 1 updating cpsr (sets C if 31st bit of r0 was 1)
adc r3, r3, r3 @ r3 <- r3 + r3 + C. This is equivalent to r3 ? (r3 << 1) + C
cmp r3, r1 @ compute r3 - r1 and update cpsr
subhs r3, r3, r1 @ if r3 >= r1 (C=1) then r3 ? r3 - r1
adc r2, r2, r2 @ r2 <- r2 + r2 + C. This is equivalent to r2 <- (r2 << 1) + C
2:
subs r4, r4, #1 @ r4 <- r4 - 1
bpl 1b @ if r4 >= 0 (N=0) then loop
pop {r4, lr}
bx lr
</syntaxhighlight>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">
on printConsole(x)
return x as string
end printConsole
 
set {i, table} to {0, {return}}
repeat while (i mod 6 is not 0 or i is not 6)
set i to i + 1
set end of table to i & return
printConsole(table)
end repeat
</syntaxhighlight>
{{out}}
<pre>
"
1
2
3
4
5
6
"
</pre>
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">value: 0
until [
value: value + 1
print value
] [ 0 = value%6 ]</syntaxhighlight>
 
{{out}}
 
<pre>1
2
3
4
5
6</pre>
 
=={{header|Asymptote}}==
Asymptote's control structures are similar to those in C, C++, or Java
<syntaxhighlight lang="asymptote">int i = 0;
do {
++i;
write(" ", i, suffix=none);
} while (i % 6 != 0);</syntaxhighlight>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">While mod(A_Index, 6) ;comment:everything but 0 is considered true
output = %output%`n%A_Index%
MsgBox % output</langsyntaxhighlight>
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">BEGIN {
val = 0
do {
Line 78 ⟶ 506:
print val
} while( val % 6 != 0)
}</langsyntaxhighlight>
 
=={{header|Axe}}==
While Axe does not have explicit do-while loops, they can be easily emulated using an infinite loop with a conditional terminator:
<syntaxhighlight lang="axe">0→A
While 1
A++
Disp A▶Dec,i
End!If A^6</syntaxhighlight>
 
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
{{works with|QuickBasic|4.5}}
{{works with|Commodore BASIC}}
<lang qbasic>a = 0
<syntaxhighlight lang="gwbasic"> 0 REMADE FOR DO WHILE
1 DEF FN MOD6(N) = N - INT (N / 6) * 6
2 LET V4LUE = 0
3 FOR DO = 0 TO 1
10 LET V4LUE = V4LUE + 1
20 PRINT V4LUE" ";
30 WHILE = FN MOD6(V4LUE) < > 0:DO = NOT WHILE: NEXT</syntaxhighlight>
 
==={{header|ASIC}}===
ASIC does not have a <code>do .. while</code> construct. Equivalent using <code>WHILE</code>:
<syntaxhighlight lang="basic">
REM Loops/Do-while
 
I = 0
REM first iteration - before the While
I = I + 1
PRINT I
IMod6 = I MOD 6
WHILE IMod6 <> 0
I = I + 1
PRINT I
IMod6 = I MOD 6
WEND
 
END
</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
Equivalent using conditional jump:
<syntaxhighlight lang="basic">
REM Loops/Do-while
 
I = 0
LoopStart:
I = I + 1
PRINT I
IMod6 = I MOD 6
IF IMod6 <> 0 THEN LoopStart:
 
END
</syntaxhighlight>
{{out}}
As above
 
==={{header|BaCon}}===
<syntaxhighlight lang="freebasic">
a=0
REPEAT
INCR a
PRINT a
UNTIL MOD(a,6) == 0
</syntaxhighlight>
 
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">i = 0
 
do
i a += a + 1
print i; " ";
print a
loopuntil while ai mod 6 <>= 0</lang>
print
end</syntaxhighlight>
 
==={{header|BBC BASIC}}===
<langsyntaxhighlight lang="bbcbasic">a = 0
REPEAT
a = a + 1
PRINT a
UNTIL a MOD 6 = 0</langsyntaxhighlight>
 
==={{header|Chipmunk Basic}}===
In ''Chipmunk Basic Man Page'', the words <code>do</code>, <code>loop</code>, and <code>until</code> are mentioned as reserved, but the <code>do .. loop until</code> statement is not described, probably because of uncorrected abnormal behavior of the interpreter. In case of such behavior you may use equivalents (e.g. with <code>while .. wend</code>).
<syntaxhighlight lang="basic">
100 rem Loops/Do-while
110 i = 0
120 do
130 i = i+1
140 print i
150 loop until i mod 6 = 0
160 end
</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
==={{header|Commodore BASIC}}===
<syntaxhighlight lang="basic">50 rem does not have do-while simultate using for-next
100 x=0
120 for b=-1 to 0 step 0
130 x=x+1
140 print x
150 b=x/6<>int(x/6)
160 next x
</syntaxhighlight>
 
==={{header|FreeBASIC}}===
<syntaxhighlight lang="freebasic">' FB 1.05. 0 Win64
 
Dim i As Integer = 0
Do
i += 1
Print i; " ";
Loop While i Mod 6 <> 0
Print
Sleep</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 5 6
</pre>
 
==={{header|FutureBasic}}===
<syntaxhighlight lang="futurebasic">window 1
 
dim as long i
 
do
i++
print i
until ( i mod 6 == 0 )
 
HandleEvents</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
==={{header|Gambas}}===
'''[https://gambas-playground.proko.eu/?gist=57e91eab60baf7e39df9b6d16a0deddd Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
Dim siCount As Short
 
Repeat
Inc siCount
Print siCount;;
Until siCount Mod 6 = 0
 
End</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 5 6
</pre>
 
==={{header|GW-BASIC}}===
GW-BASIC does not have a <code>do .. while</code> construct.
Equivalent using <code>WHILE</code>:
{{works with|BASICA}}
{{works with|PC-BASIC|any}}
<syntaxhighlight lang="gwbasic">
10 LET I% = 0
20 ' first iteration - before the WHILE
30 LET I% = I% + 1
40 PRINT I%
50 WHILE I% MOD 6 <> 0
60 LET I% = I% + 1
70 PRINT I%
80 WEND
</syntaxhighlight>
Equivalent using <code>GOTO</code>:
{{works with|BASICA}}
{{works with|PC-BASIC|any}}
<syntaxhighlight lang="gwbasic">
10 LET I% = 0
20 LET I% = I% + 1
30 PRINT I%
40 IF I% MOD 6 <> 0 THEN GOTO 20
</syntaxhighlight>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 LET I=0
110 DO
120 LET I=I+1
130 PRINT I
140 LOOP UNTIL MOD(I,6)=0</syntaxhighlight>
 
==={{header|Liberty BASIC}}===
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">
a = 0
do
a = a + 1
print a
loop until (a mod 6) = 0
</syntaxhighlight>
See also [[#QBasic|QBasic]].
 
==={{header|Microsoft Small Basic}}===
Microsoft Small Basic does not have a <code>do .. while</code> construct.
Equivalent using <code>While</code>:
<syntaxhighlight lang="microsoftsmallbasic">
i = 0
' first iteration - before the While
i = i + 1
TextWindow.WriteLine(i)
While Math.Remainder(i, 6) <> 0
i = i + 1
TextWindow.WriteLine(i)
EndWhile
</syntaxhighlight>
Equivalent using <code>Goto</code>:
<syntaxhighlight lang="microsoftsmallbasic">
i = 0
loopStart:
i = i + 1
TextWindow.WriteLine(i)
If Math.Remainder(i, 6) <> 0 Then
Goto loopStart
EndIf
</syntaxhighlight>
 
==={{header|Minimal BASIC}}===
Minimal BASIC does not have a <code>do .. while</code> construct. Equivalent using conditional jump:
<syntaxhighlight lang="gwbasic">
10 REM Loops/Do-while
20 LET I=0
30 LET I=I+1
40 PRINT I
50 IF INT(I/6)*6 <> I THEN 30
60 END
</syntaxhighlight>
 
==={{header|MSX Basic}}===
The [[#Minimal BASIC|Minimal BASIC]] solution works without any changes.
 
==={{header|NS-HUBASIC}}===
<syntaxhighlight lang="ns-hubasic">10 PRINT "NO,"A" ISN'T A MULTIPLE OF 6."
20 A=A+1
30 IF A-(A/6)*6<>0 THEN GOTO 10
40 PRINT "YES, 6 IS A MULTIPLE OF 6."</syntaxhighlight>
 
==={{header|PureBasic}}===
{{works with|PureBasic|4.41}}
<syntaxhighlight lang="purebasic">x=0
Repeat
x+1
Debug x
Until x%6=0</syntaxhighlight>
 
==={{header|QB64}}===
''CBTJD'': 2020/03/14
<syntaxhighlight lang="qbasic">DO
PRINT n
n = n + 1
LOOP WHILE n MOD 6 <> 0</syntaxhighlight>
 
<syntaxhighlight lang="qb64">
'Another demo of DO loops
Dim As Integer Counter
Print "First loop DO..LOOP UNTIL"
Counter = 0
Do
Print Counter
Counter = Counter + 1
Loop Until Counter Mod 6 = 0
Print "Counter Mod 6 = "; Counter Mod 6
Print "First loop DO WHILE..LOOP"
Counter = 1
Do While Counter Mod 6 <> 0
Print Counter
Counter = Counter + 1
Loop
Print "Counter Mod 6 = "; Counter Mod 6
End
</syntaxhighlight>
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
{{works with|Just BASIC}}
<syntaxhighlight lang="qbasic">a = 0
DO
a = a + 1
PRINT a;
LOOP WHILE a MOD 6 <> 0</syntaxhighlight>
 
==={{header|Quite BASIC}}===
The [[#Minimal BASIC|Minimal BASIC]] solution works without any changes.
 
==={{header|Run BASIC}}===
Run Basic does not have a <code>do .. while</code> construct. Equivalent using conditional jump:
<syntaxhighlight lang="lb">i = 0
[start]
i = i +1
print i; " ";
if i mod 6 <> 0 then [start]</syntaxhighlight>
 
==={{header|Sinclair ZX81 BASIC}}===
<syntaxhighlight lang="basic">10 LET X=0
20 LET X=X+1
30 PRINT X
40 IF X/6<>INT (X/6) THEN GOTO 20</syntaxhighlight>
 
==={{header|SmallBASIC}}===
<syntaxhighlight lang="qbasic">
repeat
v++
print v
until(v mod 6 == 0)
</syntaxhighlight>
 
==={{Header|Tiny BASIC}}===
Tiny Basic does not have a <code>do .. while</code> construct. Equivalent using conditional jump:
{{works with|TinyBasic}}
<syntaxhighlight lang="basic">10 REM Loops/Do-while
20 LET I = 0
30 LET I = I + 1
40 PRINT I
50 IF (I / 6) * 6 <> I THEN GOTO 30
60 END</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
==={{header|True BASIC}}===
<syntaxhighlight lang="basic">LET i = 0
 
DO
LET i = i + 1
PRINT i; " ";
LOOP WHILE REMAINDER(i, 6) <> 0
PRINT
END</syntaxhighlight>
 
==={{header|VBA}}===
<syntaxhighlight lang="vb">Public Sub LoopDoWhile()
Dim value As Integer
value = 0
Do
value = value + 1
Debug.Print value;
Loop While value Mod 6 <> 0
End Sub</syntaxhighlight>{{out}}<pre> 1 2 3 4 5 6 </pre>
 
==={{header|Visual Basic .NET}}===
<syntaxhighlight lang="vbnet">Dim i = 0
Do
i += 1
Console.WriteLine(i)
Loop Until i Mod 6 = 0</syntaxhighlight>
 
==={{header|XBasic}}===
{{works with|Windows XBasic}}
<syntaxhighlight lang="xbasic">
PROGRAM "dowhile"
 
DECLARE FUNCTION Entry()
 
FUNCTION Entry()
val% = 0
DO
INC val%
PRINT val%
LOOP WHILE val% MOD 6 <> 0 ' or LOOP UNTIL val% MOD 6 = 0
END FUNCTION
END PROGRAM
</syntaxhighlight>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">i = 0
repeat
i = i + 1
print i, " ";
until mod(i, 6) = 0
print</syntaxhighlight>
 
=={{header|bc}}==
<langsyntaxhighlight lang="bc">i = 0
for (;;) {
++i /* increments then prints i */
if (i % 6 == 0) break
}
quit</langsyntaxhighlight>
 
=={{header|Befunge}}==
<langsyntaxhighlight lang="befunge">0>1+:.v
|%6: <
@</langsyntaxhighlight>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">int val = 0;
do{
val++;
printf("%d\n",val);
}while(val % 6 != 0);</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
 
<syntaxhighlight lang="csharp">int a = 0;
 
do
{
a += 1;
Console.WriteLine(a);
} while (a % 6 != 0);</syntaxhighlight>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">int val = 0;
do{
val++;
std::cout << val << std::endl;
}while(val % 6 != 0);</langsyntaxhighlight>
 
=={{header|C sharp|C#C3}}==
In this example we use default zero initialization of locals in C3.
<syntaxhighlight lang="c3">int val;
do
{
io::printn(++val);
}
while (val % 6 != 0);</syntaxhighlight>
 
=={{header|Chapel}}==
<lang csharp>int a = 0;
<syntaxhighlight lang="chapel">var val = 0;
do {
val += 1;
writeln(val);
} while val % 6 > 0;</syntaxhighlight>
 
=={{header|ChucK}}==
<syntaxhighlight lang="text">
0 => int value;
do
{
value++;
Console.WriteLine(a);
a += 1<<<value>>>;
}
} while (a % 6 != 0);</lang>
while(value % 6 != 0);
</syntaxhighlight>
 
=={{header|Clipper}}==
<syntaxhighlight lang="clipper"> Local n := 0
DO WHILE .T.
? ++n
IF n % 6 == 0
EXIT
ENDIF
ENDDO</syntaxhighlight>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">(loop [i 0]
(let [i* (inc i)]
(println i*)
(when-not (zero? (mod i* 6))
(recur i*))))</syntaxhighlight>
 
=={{header|COBOL}}==
The COBOL equivalent of a do-while loop is <code>PERFORM WITH TEST AFTER UNTIL some-condition</code>.
<syntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. loop-do-while.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
01 i PIC 99 VALUE 0.
 
PROCEDURE DIVISION.
PERFORM WITH TEST AFTER UNTIL FUNCTION MOD(i, 6) = 0
ADD 1 TO i
DISPLAY i
END-PERFORM
 
GOBACK
.</syntaxhighlight>
 
=={{header|Coco}}==
Do-while loops are a JavaScript feature removed in CoffeeScript but re-added in Coco.
 
<syntaxhighlight lang="coco">v = 0
do
console.log ++v
while v % 6</syntaxhighlight>
 
=={{header|CoffeeScript}}==
CoffeeScript doesn't have <code>do {} while ()</code> loop, but it can be emulated using <code>loop</code> statement and <code>break unless</code> statement.
<langsyntaxhighlight lang="coffeescript">val = 0
loop
console.log ++val
break unless val % 6</langsyntaxhighlight>
 
=={{header|ColdFusion}}==
<langsyntaxhighlight lang="cfm"><cfscript>
value = 0;
do
Line 147 ⟶ 1,029:
writeOutput( value );
} while( value % 6 != 0 );
</cfscript></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(setqlet ((val 0))
(loop do
(incf val)
(print val)
while (/= 0 (mod val 6))))</langsyntaxhighlight>
 
loop can set up temporary values, and incf returns a value, so it's also possible to do
 
<langsyntaxhighlight lang="lisp">(loop with val = 0
do (print (incf val))
until (= 0 (mod val 6)))</langsyntaxhighlight>
 
=== Using DO ===
=={{header|Clojure}}==
<syntaxhighlight lang="lisp">
<lang Clojure>(loop [i 0]
(do* ((a 0) ; Initialize to 0
(let [i* (inc i)]
(b (incf a) (incf b))) ; Set first increment and increment on every loop
(println i*)
((zerop (mod b 6)) (print b)) ; Break condition and print last value `6' (right?)
(when-not (zero? (mod i* 6))
(print b)) ; On every loop print value
(recur i*))))</lang>
</syntaxhighlight>
 
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio;
 
void main() {
Line 178 ⟶ 1,071:
write(val, " ");
} while (val % 6 != 0);
}</langsyntaxhighlight>
{{out}}
Output:
<pre>1 2 3 4 5 6 </pre>
 
=={{header|Dart}}==
<syntaxhighlight lang="dart">void main() {
int val = 0;
do {
val++;
print(val);
} while (val % 6 != 0);
}
</syntaxhighlight>
 
=={{header|dc}}==
{{trans|bc}}
<langsyntaxhighlight lang="dc">0 si [i = 0]sz
[2Q]sA [A = code to break loop]sz
[
Line 191 ⟶ 1,094:
6 % 0 =A [call A if 0 == it % 6]sz
0 0 =B [continue loop]sz
]sB 0 0 =B</langsyntaxhighlight>
 
=={{header|Delphi}}==
<langsyntaxhighlight Delphilang="delphi">program Loop;
 
{$APPTYPE CONSOLE}
Line 209 ⟶ 1,112:
Writeln;
Readln;
end.</langsyntaxhighlight>
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec main() void:
byte i;
i := 0;
while
i := i + 1;
write(i:2);
i % 6 ~= 0
do od
corp</syntaxhighlight>
{{out}}
<pre> 1 2 3 4 5 6</pre>
 
=={{header|Dragon}}==
 
<syntaxhighlight lang="dragon">val = 0
do{
val++
showln val
}while(val % 6 != 0)</syntaxhighlight>
 
=={{header|DUP}}==
 
DUP only provides a while loop in the form of <code DUP>[condition][block]#</code>, where the block is executed in a loop as long as the condition is nonzero/true.
A do-while loop is technically nothing more than executing the block once before running an ordinary while loop, so we simply define an operator or function that contains the block (comments in curly braces):
 
<syntaxhighlight lang="dup">[1+$.' ,]⇒A {operator definition: PUSH 1, ADD, DUP, print top of stack to SDTOUT, print whitespace}
[1+$.' ,]a: {function definition}</syntaxhighlight>
 
and put the defined block in front of the while loop, and inside the while loop itself:
 
If the block was defined as an operator, the whole program would look like this (comments in curly braces):
 
<syntaxhighlight lang="dup">[1+$.' ,]⇒A
0 A[$6/%][A]# {PUSH 0, execute operator A, [DUP, PUSH 6, MOD/DIV, POP][execute operator A]#}</syntaxhighlight>
 
And if the block is defined as a named function:
 
<syntaxhighlight lang="dup">[1+$.' ,]a:
0 a;![$6/%][a;!]#</syntaxhighlight>
 
Result:
 
<syntaxhighlight lang="dup">1 2 3 4 5 6</syntaxhighlight>
 
=={{header|DWScript}}==
<syntaxhighlight lang="delphi">
<lang Delphi>
var i := 0;
 
Line 219 ⟶ 1,167:
PrintLn(i);
until i mod 6 = 0;
</syntaxhighlight>
</lang>
'''Bold text'''
 
=={{header|Dyalect}}==
 
<syntaxhighlight lang="dyalect">var x = 0
 
do
{
x += 1
print(x)
} while x % 6 != 0</syntaxhighlight>
 
=={{header|E}}==
E does not have an official do-while construct, but the primitive which loops are built out of (which calls a function which returns a boolean indicating whether it should be called again) can be used to construct a do-while.
<langsyntaxhighlight lang="e">var x := 0
__loop(fn {
x += 1
println(x)
x % 6 != 0 # this is the return value of the function
})</langsyntaxhighlight>
 
<!-- XXX we should have an example of lambda-args sugar here -->
 
=={{header|EasyLang}}==
<syntaxhighlight lang=text>
value = 0
repeat
value += 1
print value
until value mod 6 = 0
.
</syntaxhighlight>
 
=={{header|Ela}}==
 
<langsyntaxhighlight lang="ela">open consolemonad io
 
loop n | n % 6 == 0 = outdo $return ()
| else = outdo $ loop (n+1)
where out =putStrLn (& writenshow n)</lang>
loop (n+1)
 
_ = loop 10 ::: IO</syntaxhighlight>
This implementation uses a thunk to represent a console output. Output is not done in the initialization of 'out' variable, it is done when 'out' calculation is forced by a '$' operator (sequencing operator).
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">defmodule Loops do
def do_while(n) do
n1 = n + 1
IO.puts n1
if rem(n1, 6) == 0, do: :ok,
else: do_while(n1)
end
end
 
Loops.do_while(0)</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
The condition form for <code>while</code> can be a <code>progn</code> to evaluate arbitrary code before the loop condition. The body of a <code>while</code> can be empty.
 
<syntaxhighlight lang="lisp">(let ((val 0))
(while (progn
(setq val (1+ val))
(message "%d" val)
(/= 0 (mod val 6)))))</syntaxhighlight>
 
Alternatively, the loop can be rewritten to check for the exit condition and fulfill it at the end of the loop body.
 
<syntaxhighlight lang="lisp">(let ((val 0) done)
(while (not done)
(setq val (1+ val))
(message "%d" val)
(setq done (zerop (mod val 6)))))</syntaxhighlight>
 
=={{header|Erlang}}==
 
<syntaxhighlight lang="erlang">
<lang Erlang>
do() ->
io:formatdo("0~n"),.
do(1).
do(0) ->
io:fwrite( "0 " ),
do( 1 );
do(N) when N rem 6 =:= 0 ->
io:format("~w~n", [N]);
do(N) ->
io:formatfwrite( "~w~np ", [N] ),
do(N+1).
</syntaxhighlight>
</lang>
 
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
A=0
REPEAT
A=A+1
PRINT(A)
UNTIL A MOD 6=0 !UNTIL A-6*INT(A/6)=0 for C-64
</syntaxhighlight>
 
=={{header|Euphoria}}==
{{works with|Open Euphoria}}
<syntaxhighlight lang="euphoria">
include std/console.e
include std/math.e
 
atom x = 0
 
loop do
x += 1
?x
until(mod(x,6)) = 0
end loop
 
if getc(0) then end if
</syntaxhighlight>
 
=={{header|F_Sharp|F#}}==
If you must have a loop then this is acceptable F#
<syntaxhighlight lang="fsharp">
let rec loop n =
printfn "%d " n
if (n+1)%6 > 0 then loop (n+1)
loop 0
</syntaxhighlight>
 
But I prefer this way:
<syntaxhighlight lang="fsharp">
Seq.initInfinite id |> Seq.takeWhile(fun n->n=0 || n%6>0) |> Seq.iter (fun n-> printfn "%d" n)
</syntaxhighlight>
 
Either produces:
{{out}}
<pre>
0
1
2
3
4
5
</pre>
 
Many of the solutions to this task show no output in spite of it being required in the task dexcription, so who knows what they do? Of some that have output they think it should be 1 to 6, who can tell from the task description? The following produces 1..6.
 
<syntaxhighlight lang="fsharp">
// Loops/Do-while. Nigel Galloway: February 14th., 2022
Seq.unfold(fun n->match n with Some n->let n=n+1 in Some(n,if n%6=0 then None else Some(n)) |_->None)(Some 0)|>Seq.iter(printfn "%d")
</syntaxhighlight>
{{out}}
<pre>
 
1
2
3
4
5
6
</pre>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">0 [ dup 6 mod 0 = not ] [ [ . ] [ 1 + ] bi ] do while drop</langsyntaxhighlight>
 
=={{header|Fantom}}==
Line 263 ⟶ 1,332:
There is no do-while statement in Fantom, so instead use an infinite while loop with a break statement:
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 277 ⟶ 1,346:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: do-until
0
begin 1+
Line 286 ⟶ 1,355:
dup 6 mod 0=
until
drop ;</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">INTEGER :: i = 0
DO
i = i + 1
WRITE(*, *) i
IF (MOD(i, 6) == 0) EXIT
END DO</langsyntaxhighlight>
 
{{works with|Fortran|77 and later}}
<langsyntaxhighlight lang="fortran"> PROGRAM DOWHILE
C Initialize modulus and value.
INTEGER MODLUS, IVALUE
Line 312 ⟶ 1,381:
 
STOP
END</langsyntaxhighlight>
 
{{works with|Fortran|IV and later}}
=={{header|Go}}==
<syntaxhighlight lang="fortran"> IVALUE = 0
No do-while in Go.
10 CONTINUE
<lang go>package main
IVALUE=IVALUE+1
WRITE(6,301) IVALUE
301 FORMAT(I5)
IF(MOD(IVALUE,6).NE.0) GOTO 10
END</syntaxhighlight>
 
{{works with|Fortran|I and later}}
import "fmt"
<syntaxhighlight lang="fortran"> IVALUE = 0
10 IVALUE=IVALUE+1
WRITE 301,IVALUE
301 FORMAT(I5)
IF(IVALUE-IVALUE/6*6) 10,20,10
20 STOP
END</syntaxhighlight>
 
=={{header|Fortress}}==
func main() {
 
for value := 0;; {
Due to the way that Fortress works, you have to use a label to escape a loop upon a specified condition being met. There is no traditional <code>break</code> equivalent.
value++
 
fmt.Println(value)
<syntaxhighlight lang="fortress">
if value % 6 == 0 {
component loops_do_while
break
export Executable
}
 
}
var x:ZZ32 = 0
}</lang>
run() = label loop
Output:
while true do
<pre>1
x += 1
println(x)
 
if (x MOD 6) = 0
then exit loop
end
end
end loop
end
</syntaxhighlight>
 
{{out}}
<pre>
1
2
3
4
5
6
6</pre>
</pre>
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">n = 0
do
{
n = n + 1
println[n]
} while n mod 6 != 0</syntaxhighlight>
 
=={{header|GAP}}==
<syntaxhighlight lang="gap">n := 0;
repeat
n := n + 1;
Print(n, "\n");
until RemInt(n, 6) = 0;</syntaxhighlight>
 
=={{header|GML}}==
<langsyntaxhighlight GMLlang="gml">i = 0
do
{
Line 344 ⟶ 1,455:
show_message(string(i))
}
until (i mod 6 = 0)</langsyntaxhighlight>
 
=={{header|Go}}==
There is no explicit do-while in Go, but it can be simulated with a range-based for loop and the break statement.
<syntaxhighlight lang="go">package main
 
import "fmt"
 
func main() {
var value int
for {
value++
fmt.Println(value)
if value%6 != 0 {
break
}
}
}</syntaxhighlight>
{{out}}
<pre>1
2
3
4
5
6</pre>
It can also be simulated ''without'' using a break statement as follows:
<syntaxhighlight lang="go">package main
 
import "fmt"
 
func main() {
var value int
for ok := true; ok; ok = value%6 != 0 {
value++
fmt.Println(value)
}
}</syntaxhighlight>
 
{{out}}
<pre>
Same as before.
</pre>
::<syntaxhighlight lang="go">package main
 
import "fmt"
 
func main() {
// do-while loop 1
n1 := 2
for n1 < 6 {
n1 *= 2
}
fmt.Println(n1) // prt 8
// do-while loop 2
n2 := 2
for ok := true; ok; ok = n2%8 != 0 {
n2 *= 2
}
fmt.Println(n2) // prt 8
// do-while loop 3
n3 := 2
for {
n3 *= 2
if n3 >= 6 {
break
}
}
fmt.Println(n3) // prt 8
}</syntaxhighlight>
 
=={{header|Groovy}}==
For Groovy 3.0.0 and later.
Groovy does not have a bottom-checking loop construct! So use an "infinite" while loop with a conditional break as the last statement
<langsyntaxhighlight lang="groovy">def i = 0
do {
i++
println i
} while (i % 6 != 0)</syntaxhighlight>
Previous versions of Groovy did not have a bottom-checking loop construct. Workaround is to use an "infinite" while loop with a conditional break as the last statement.
<syntaxhighlight lang="groovy">def i = 0
while (true) {
i++
println i
if ( i % 6 == 0) break
}</langsyntaxhighlight>
 
{{out}}
Output:
<pre>1
2
Line 363 ⟶ 1,548:
6</pre>
 
=={{header|HaskellHarbour}}==
<syntaxhighlight lang="visualfoxpro">LOCAL n := 0
 
DO WHILE .T.
<lang haskell>import Data.List
? ++n
IF n % 6 == 0
EXIT
ENDIF
ENDDO</syntaxhighlight>
 
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">import Data.List
import Control.Monad
import Control.Arrow
 
doWhile p f n = (n:) $ takeWhile p $ unfoldr (Just.(id &&& f)) $ succ n</langsyntaxhighlight>
Example executed in GHCi:
<langsyntaxhighlight lang="haskell">*Main> mapM_ print $ doWhile ((/=0).(`mod`6)) succ 0
0
1
Line 377 ⟶ 1,571:
3
4
5</langsyntaxhighlight>
 
The standard Prelude also includes, without further import or definition, an '''until''' function, which takes three arguments – a predicate function, a transformation function, and an initial value.
 
<syntaxhighlight lang="haskell">main :: IO ()
main =
mapM_ print . reverse $
until
(\(x:_) -> (x > 0) && (mod x 6 == 0))
(\xs@(x:_) -> succ x : xs)
[0]</syntaxhighlight>
 
{{Out}}
<pre>0
1
2
3
4
5
6
</pre>
=== With mutable references ===
Using iterateWhile from monad-loops package
<syntaxhighlight lang="haskell">import Data.IORef
import Control.Monad.Loops
 
main = do
x <- newIORef 0;
iterateWhile (\val -> val `mod` 6 /= 0 ) $ do
modifyIORef x (+1)
val <- readIORef x
print val
return val</syntaxhighlight>
 
=={{header|Haxe}}==
<syntaxhighlight lang="haxe">var val = 0;
 
do {
val++;
Sys.println(val);
} while( val % 6 != 0);</syntaxhighlight>
 
=={{header|HolyC}}==
<syntaxhighlight lang="holyc">U8 i = 0;
do {
i++;
Print("%d\n", i);
} while (i % 6 != 0);</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Icon and Unicon do not have a do-while looping control with end of loop checking. There are four looping controls 'every', 'repeat', 'until', and 'while' (see [[Icon%2BUnicon/Intro#Looping_Controls|Introduction to Icon and Unicon/Looping Controls]] for more information.)
<langsyntaxhighlight Iconlang="icon">procedure main()
 
i := 0
Line 388 ⟶ 1,629:
if i % 6 = 0 then break
}
end</langsyntaxhighlight>
 
=={{header|J}}==
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:
 
<syntaxhighlight lang=J> ,. ([^:(0=6|])>:)^:a: 0
0
1
2
3
4
5
</syntaxhighlight>
 
This could also be accomplished using [[j:Vocabulary/zcapco|Z:]] to provide early termination from a [[j:Vocabulary/fcap|fold]]:
 
<syntaxhighlight lang=J> 0#]F.(>: [ echo [ _2 Z: * * 0=6|]) 0
0
1
2
3
4
5
 
</syntaxhighlight>
 
J does support loops for those times they can't be avoided (just like many languages support gotos for those time they can't be avoided).
<langsyntaxhighlight lang="j">3 : 0 ] 0
 
NB. The 'st' in 'whilst' stands for 'skip test'
Line 406 ⟶ 1,666:
 
i.0 0
)</langsyntaxhighlight>
 
Though it's rare to see J code like this.
 
=={{header|Java}}==
 
<lang java>int val = 0;
<syntaxhighlight lang="java">int val = 0;
do{
val++;
System.out.println(val);
}while(val % 6 != 0);</langsyntaxhighlight>
 
=={{header|JavaScript}}==
 
<lang javascript>var val = 0;
===Javascript: Imperative===
<syntaxhighlight lang="javascript">var val = 0;
do {
print(++val);
} while (val % 6);</langsyntaxhighlight>
 
===Javascript: Functional===
====ES5====
In a functional idiom of JavaScript we cannot use a Do While '''statement''', as it returns no value and is not a composable expression. We can, however achieve the same effect with a composable doWhile '''function''', which takes three arguments, and returns the output series as a value.
 
:#An initial value,
:#a Do function which transforms that value repetitively, corresponding to the body of the loop,
:#and a conditional While function.
 
<syntaxhighlight lang="javascript">function doWhile(varValue, fnBody, fnTest) {
'use strict';
var d = fnBody(varValue); // a transformed value
 
return fnTest(d) ? [d].concat(
doWhile(d, fnBody, fnTest)
) : [d];
}
 
console.log(
doWhile(0, // initial value
function (x) { // Do body, returning transformed value
return x + 1;
},
function (x) { // While condition
return x % 6;
}
).join('\n')
);</syntaxhighlight>
 
Output:
<syntaxhighlight lang="javascript">1
2
3
4
5
6</syntaxhighlight>
 
Alternatively, if we assume instead that the unstated problem was not to produce repetitive computation, but to derive the '''membership of a set''' we could interpret the task as a request for a JavaScript implementation of the '''takeWhile''' function – a familiar staple of functional list processing.
 
So, for example, something like:
 
<syntaxhighlight lang="javascript">function range(m, n) {
'use strict';
return Array.apply(null, Array(n - m + 1)).map(
function (x, i) {
return m + i;
}
);
}
function takeWhile(lst, fnTest) {
'use strict';
var varHead = lst.length ? lst[0] : null;
return varHead ? (
fnTest(varHead) ? [varHead].concat(
takeWhile(lst.slice(1), fnTest)
) : []
) : []
}
console.log(
takeWhile(
range(1, 100),
function (x) {
return x % 6;
}
).join('\n')
);</syntaxhighlight>
 
Output:
<syntaxhighlight lang="javascript">1
2
3
4
5</syntaxhighlight>
 
====ES6====
A process or value of this kind might be better expressed (in functionally composed JavaScript) with an '''unfold''' or '''until''' function, returning a list.
 
<syntaxhighlight lang="javascript">(() => {
'use strict';
 
// unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
function unfoldr(mf, v) {
for (var lst = [], a = v, m;
(m = mf(a)) && m.valid;) {
lst.push(m.value), a = m.new;
}
return lst;
}
 
// until :: (a -> Bool) -> (a -> a) -> a -> a
function until(p, f, x) {
let v = x;
while(!p(v)) v = f(v);
return v;
}
 
let result1 = unfoldr(
x => {
return {
value: x,
valid: (x % 6) !== 0,
new: x + 1
}
},
1
);
 
let result2 = until(
m => (m.n % 6) === 0,
m => {
return {
n : m.n + 1,
xs : m.xs.concat(m.n)
};
},
{
n: 1,
xs: []
}
).xs;
return [result1, result2];
})();
</syntaxhighlight>
 
<syntaxhighlight lang="javascript">[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]</syntaxhighlight>
 
ES6 is a superset of Javascript so the Javascript and ES5 solution is valid. An example of a do-while loop in a generator follows that produces correct output:
 
<syntaxhighlight lang="javascript">
// generator with the do while loop
function* getValue(stop) {
var i = 0;
do {
yield ++i;
} while (i % stop != 0);
}
 
// function to print the value and invoke next
function printVal(g, v) {
if (!v.done) {
console.log(v.value);
setImmediate(printVal, g, g.next());
}
}
 
(() => {
var gen = getValue(6);
printVal(gen, gen.next());
})();
</syntaxhighlight>
 
<syntaxhighlight lang="javascript">
1
2
3
4
5
6
</syntaxhighlight>
 
=={{header|jq}}==
{{works with|jq|1.4}}
In jq 1.4, the "recurse" built-in always emits the input value, and so to accomplish the task specified here,
we shall define a control structure: "do_while(action; condition)" as follows:
<syntaxhighlight lang="jq"># Perform the action, then check the condition, etc
def do_while( action; condition ):
def w: action | if (condition | not) then empty else ., w end;
w;</syntaxhighlight>
'''The task:'''
<syntaxhighlight lang="jq">0 | do_while( .+1; . % 6 != 0 )</syntaxhighlight>
{{out}}
1
2
3
4
5
 
=={{header|Julia}}==
Julia has no do-while construct. Here is one of several ways to implement do-while behavior.
 
<syntaxhighlight lang="julia">
julia> i = 0
0
 
julia> while true
println(i)
i += 1
i % 6 == 0 && break
end
0
1
2
3
4
5
</syntaxhighlight>
 
Using a macro that mimics the classic C style do-while.
 
Notice that the symbol <code>while</code> cannot be used as it is a keyword, which is why <code>when</code> is used instead, also the macro definition is wrapped in a <code>@eval</code> macro invocation since <code>do</code> is also a keyword, but in Julia macro calls are prefixed by <code>@</code> so this is only an issue during the macro definition, not when invoked, ie. <code>@do block when condition</code>).
 
<syntaxhighlight lang="julia">
julia> @eval macro $(:do)(block, when::Symbol, condition)
when ≠ :when && error("@do expected `when` got `$s`")
quote
let
$block
while $condition
$block
end
end
end |> esc
end
@do (macro with 1 method)
 
julia> i = 0
0
 
julia> @do begin
@show i
i += 1
end when i % 6 ≠ 0
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
</syntaxhighlight>
 
Here is mostly the same macro, but with the conditional clause used first, which is arguably more readable.
 
<syntaxhighlight lang="julia">
julia> macro do_while(condition, block)
quote
let
$block
while $condition
$block
end
end
end |> esc
end
@do_while (macro with 1 method)
 
julia> i = 0
0
 
julia> @do_while i % 6 ≠ 0 begin
@show i
i += 1
end
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
</syntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.0.6
 
fun main(args: Array<String>) {
var value = 0
do {
println(++value)
}
while (value % 6 != 0)
}</syntaxhighlight>
 
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
=={{header|LabVIEW}}==
{{VI snippet}}<br/>[[File:LabVIEW_Loops_Do-while.png]]
 
=={{header|Liberty BASIC}}==
=={{header|Lasso}}==
<lang lb>
<syntaxhighlight lang="lasso">local(x = 0)
a = 0
while(#x % 6 > 0 || #x == 0) => {^
do
++#x
a =a +1
'\r' // for formatting
print a
^}</syntaxhighlight>
loop until ( a mod 6) = 0
 
</lang>
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{def do_while
{def do_while.r
{lambda {:i}
{if {= {% :i 6} 0}
then :i (end of loop)
else :i {do_while.r {+ :i 1}}}}}
{lambda {:i}
:i {do_while.r {+ :i 1}}}}
-> do_while
 
{do_while 0}
-> 0 1 2 3 4 5 6 (end of loop)
</syntaxhighlight>
 
=={{header|Lang}}==
Lang does not have a do-while loop. A simple loop like the example below can be used.
<syntaxhighlight lang="lang">
$i = 0
loop {
$i += 1
fn.println($i)
if(!($i % 6)) {
con.break
}
}
</syntaxhighlight>
 
=={{header|Lingo}}==
Lingo has no do..while, but here how this behavior can be implemented:
<syntaxhighlight lang="lingo">i = 0
repeat while TRUE
i = i+1
put i
if i mod 6 = 0 then exit repeat
end</syntaxhighlight>
 
=={{header|Lisaac}}==
<langsyntaxhighlight Lisaaclang="lisaac">+ val : INTEGER;
{
val := val + 1;
Line 442 ⟶ 2,027:
'\n'.print;
val % 6 != 0
}.while_do { };</langsyntaxhighlight>
 
=={{header|LiveCode}}==
<syntaxhighlight lang="livecode">repeat while n mod 6 is not 0 or n is 0
add 1 to n
put n
end repeat</syntaxhighlight>
 
=={{header|Logo}}==
<syntaxhighlight lang="logo">make "val 0
do.while [make "val :val + 1 print :val] [notequal? 0 modulo :val 6]
do.until [make "val :val + 1 print :val] [equal? 0 modulo :val 6]
 
to my.loop :n
make "n :n + 1
print :n
if notequal? 0 modulo :n 6 [my.loop :n]
end
my.loop 0</syntaxhighlight>
 
=={{header|Lua}}==
Line 448 ⟶ 2,051:
Lua doesn't have a <code>do .. while</code> construct.
 
<langsyntaxhighlight lang="lua">
i=0
repeat
Line 454 ⟶ 2,057:
print(i)
until i%6 == 0
</syntaxhighlight>
</lang>
 
=={{header|LogoM2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang logo>make "val 0
Module checkit {
do.while [make "val :val + 1 print :val] [notequal? 0 modulo :val 6]
x=0
do.until [make "val :val + 1 print :val] [equal? 0 modulo :val 6]
\\ Do or Repeat
Do
x++
print x,
when x mod 6>0
print
// or we can use Until x mod 6 = 0
// and we can use block if we like it
x=0
Do {
x++
print x,
} when x mod 6>0
print
x=0
{
\\ when enter to block the loop flag change to false
x++
if x mod 6<>0 Then loop ' set loop flag of current block to true
\\ when block end check Loop flag and if true execute block again
print x,
}
print
}
Checkit
module Old_Style {
10 REM Loops/Do-while
20 LET I=0
30 LET I=I+1
40 PRINT I
50 IF INT(I/6)*6 <> I THEN 30
60 END
}
Old_Style
// modern style, using high order functions
module generic_iterator {
do_while = lambda (f, p)->{
{
if p(f()) then loop
}
}
funcA=lambda (start_from, do_what) -> {
=lambda i=start_from, do_what ->{
call do_what(i)
=i
i++
}
}
funcPrint=lambda ->{
print number
}
call do_while(funcA(1, funcPrint), lambda->number mod 6 <>0)
}
generic_iterator
</syntaxhighlight>
 
{{out}}
to my.loop :n
<pre>
make "n :n + 1
1 2 3 4 5 6
print :n
1 2 3 4 5 6
if notequal? 0 modulo :n 6 [my.loop :n]
1 2 3 4 5 6
end
1
my.loop 0</lang>
2
3
4
5
6
1
2
3
4
5
6
</pre>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">val := 0:
do
val := 1 + val;
print( val );
if irem( val, 6 ) = 0 then
break
end if;
end do:</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Because everything is an expression in Mathematica, <code>While[body;condition]</code> tests <code>condition</code> after <code>body</code> has been executed at least once.
<lang Mathematica>value = 5;
<syntaxhighlight lang="mathematica">value = 0;
NestWhile[
While[
# + 1 &
value++;
,
Print[value];
, (Print[#]; Mod[#value, 6] != 0) &
]</syntaxhighlight>
];</lang>
gives back:
<lang Mathematica>5
6</lang>
If the starting value is 6, only 6 is returned.
 
=={{header|MATLAB}} / {{header|Octave}}==
 
<langsyntaxhighlight Matlablang="matlab"> a=0;
while (1)
a = a+1;
disp(a);
if (~mod(a,6)) break; end;
end; </langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">block([n: 0], do (ldisp(n: n + 1), if mod(n, 6) = 0 then return('done)))$</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">a = 0
do
(
Line 500 ⟶ 2,176:
a += 1
)
while mod a 6 != 0</langsyntaxhighlight>
 
=={{header|Metafont}}==
Line 506 ⟶ 2,182:
Metafont has no a do-while construct; the same thing can be done using a forever loop and exitif.
 
<langsyntaxhighlight lang="metafont">a := 0;
forever: show a; a := a + 1; exitif a mod 6 = 0; endfor
end</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.6}}
<syntaxhighlight lang="min">0 (dup 6 mod 0 == over 0 != and) 'pop (puts succ) () linrec</syntaxhighlight>
 
=={{header|MIPS Assembly}}==
<syntaxhighlight lang="mips">
.text
main: li $s0, 0 # start at 0.
li $s1, 6
loop: addi $s0, $s0, 1 # add 1 to $s0
div $s0, $s1 # divide $s0 by $s1. Result is in the multiplication/division registers
mfhi $s3 # copy the remainder from the higher multiplication register to $s3
move $a0, $s0 # variable must be in $a0 to print
li $v0, 1 # 1 must be in $v0 to tell the assembler to print an integer
syscall # print the integer in $a0
bnez $s3, loop # if $s3 is not 0, jump to loop
li $v0, 10
syscall # syscall to end the program
</syntaxhighlight>
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">0 П4 КИП4 ИП4 6 / {x} x=0 02 С/П</syntaxhighlight>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE DoWhile;
IMPORT InOut;
 
Line 518 ⟶ 2,218:
 
BEGIN
i := 0;
REPEAT
INC(i);
InOut.WriteInt(i, 1);
InOut.WriteLn;
INC(i)
UNTIL i MOD 6 = 0;
END DoWhile.</langsyntaxhighlight>
 
=={{header|Modula-3}}==
This is very similar to the [[Modula-2]] code above.
<langsyntaxhighlight lang="modula3">REPEAT
i := i + 1;
IO.Put(Fmt.Int(i));
UNTIL i MOD 6 = 0;</langsyntaxhighlight>
 
=={{header|Monicelli}}==
The do-while loop is the only kind of loop available in Monicelli
<syntaxhighlight lang="monicelli">
stuzzica
... # loop body
e brematura anche, se <expr> # exit if <expr> is false
</syntaxhighlight>
 
=={{header|MUMPS}}==
{{works with|Caché ObjectScript}}
<syntaxhighlight lang="mumps">DOWHILELOOP
set val = 0
do {
set val = val + 1
write val,!
} while ((val # 6) '= 0)
quit</syntaxhighlight>
{{out}}<pre>
SAMPLES>do ^DOWHILELOOP
1
2
3
4
5
6
</pre>
 
=={{header|Neko}}==
<syntaxhighlight lang="actionscript">/**
Loops/Do-while in Neko
Tectonics:
nekoc loops-do-while.neko
neko loops-do-while
*/
 
var index = 0;
do {
index += 1;
$print(index, "\n");
} while (index % 6) != 0</syntaxhighlight>
 
{{out}}
<pre>prompt$ nekoc loops-do-while.neko
prompt$ neko loops-do-while
1
2
3
4
5
6</pre>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">mutable x = 0;
do
{
x++;
WriteLine($"$x");
} while (x % 6 != 0)</langsyntaxhighlight>
 
=={{header|NetRexx}}==
In NetRexx the '''do&ndash;while''' construct is implemented via the <code>until ''expru''</code> conditional clause of the <code>loop</code> instruction. The expression ''expru'' in the <code>until ''expru''</code> clause is evaluated at the end of the loop, guaranteeing that the loop will be executed at least once.
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
 
Line 554 ⟶ 2,307:
say i_
end
</syntaxhighlight>
</lang>
 
=={{header|NewLISP}}==
<syntaxhighlight lang="newlisp">(let ((i 0))
(do-until (= 0 (% i 6))
(println (++ i))))</syntaxhighlight>
 
=={{header|Nim}}==
Nim does not have a do-while loop. The standard way to simulate it consists in an infinite loop with a break statement:
 
<syntaxhighlight lang="nim">var val = 0
while true:
inc val
echo val
if val mod 6 == 0: break</syntaxhighlight>
 
It's also easy to write your own doWhile construction (but be aware that the instructions will be duplicated):
<syntaxhighlight lang="nim">template doWhile(a, b: untyped): untyped =
b
while a:
b
var val = 0
doWhile val mod 6 != 0:
inc val
echo val</syntaxhighlight>
 
=={{header|Nu}}==
<syntaxhighlight lang="nu">
mut n = 0
while true {
$n += 1
print $n
if $n mod 6 == 0 {break}
}
</syntaxhighlight>
 
=={{header|Oberon-2}}==
Works with oo2c Version 2
<syntaxhighlight lang="oberon2">
MODULE LoopDoWhile;
IMPORT
Out;
 
PROCEDURE Do();
VAR
i: INTEGER;
BEGIN
i := 0;
REPEAT
Out.LongInt(i,0);Out.Ln;
INC(i)
UNTIL (i MOD 6 = 0);
END Do;
 
BEGIN
Do
END LoopDoWhile.
</syntaxhighlight>
 
=={{header|Objeck}}==
<syntaxhighlight lang="objeck">
i := 0;
do {
i += 1;
i->PrintLine();
}
while (i % 6 <> 0);
</syntaxhighlight>
 
=={{header|OCaml}}==
OCaml doesn't have a do-while loop, so we can just make a local loop:
<langsyntaxhighlight lang="ocaml">let rec loop i =
let i = succ i in
Printf.printf "%d\n" i;
Line 564 ⟶ 2,385:
loop i
in
loop 0</langsyntaxhighlight>
 
or implementing a generic do-while iterator with higher order function:
 
<langsyntaxhighlight lang="ocaml">let do_while f p =
let rec loop() =
f();
Line 574 ⟶ 2,395:
in
loop()
(** val do_while : (unit -> 'a) -> (unit -> bool) -> unit *)</langsyntaxhighlight>
 
<langsyntaxhighlight lang="ocaml">let v = ref 0 in
do_while (fun () -> incr v; Printf.printf "%d\n" !v)
(fun () -> !v mod 6 <> 0)</langsyntaxhighlight>
 
The example above is the an imperative form, below is its functional counterpart:
<langsyntaxhighlight lang="ocaml">let do_while f p ~init =
let rec loop v =
let v = f v in
Line 593 ⟶ 2,414:
(v))
(fun v -> v mod 6 <> 0)
~init:0</langsyntaxhighlight>
 
Or in a very poor OCaml style, we can use an exception to exit a while loop:
<langsyntaxhighlight lang="ocaml">let v = ref 0
exception Exit_loop
try while true do
Line 604 ⟶ 2,425:
raise Exit_loop;
done
with Exit_loop -> ()</langsyntaxhighlight>
 
=={{header|Objeck}}==
<lang objeck>
i := 0;
do {
i += 1;
i->PrintLine();
}
while (i % 6 <> 0);
</lang>
 
=={{header|Octave}}==
The do-while can be changed into a do-until, just negating the condition of the while.
<langsyntaxhighlight lang="octave">val = 0;
do
val++;
disp(val)
until( mod(val, 6) == 0 )</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
<syntaxhighlight lang="oforth">0 doWhile: [ 1+ dup . dup 6 rem 0 <> ] drop</syntaxhighlight>
 
=={{header|OpenedgeOpenEdge/Progress}}==
<langsyntaxhighlight lang="progress">DEFINE VARIABLE ii AS INTEGER.
 
DO WHILE ii MODULO 6 <> 0 OR ii = 0:
ii = ii + 1.
MESSAGE ii VIEW-AS ALERT-BOX.
END.</langsyntaxhighlight>
 
=={{header|Oz}}==
Normal Oz variables are single-assignment only. So we use a "cell", which is a one-element mutable container.
<langsyntaxhighlight lang="oz">declare
I = {NewCell 0}
in
Line 640 ⟶ 2,455:
I := @I + 1
{Show @I}
end</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
The generic Pari loops (<code>while</code>, <code>until</code>) test at the beginning, so just use an infinite loop with a break.
<langsyntaxhighlight lang="parigp">x = 0;
while(1,
print(x++);
if(valx % 6 == 0, break)
)</langsyntaxhighlight>
 
If the loop body is something simple then it might be worked into the loop condition. This is obscure but compact.
 
<syntaxhighlight lang="parigp">x = 0;
while (print(x++) || x % 6, )</syntaxhighlight>
 
The condition in <code>while</code> and <code>until</code> is an expression, not a sequence, so <code>;</code> for multiple statements cannot be used there.
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program countto6(output);
 
var
Line 662 ⟶ 2,484:
writeln(i)
until i mod 6 = 0
end.</langsyntaxhighlight>
 
=={{header|PascalABC.NET}}==
<syntaxhighlight lang="delphi">
begin
var a := 0;
repeat
a += 1;
Print(a);
until a mod 6 = 0;
end.
</syntaxhighlight>
 
 
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">my $val = 0;
do {
$val++;
print "$val\n";
} while ($val % 6);</langsyntaxhighlight>
<code>do ... until (''condition'')</code> is equivalent to <code>do ... while (not ''condition'')</code>.
<langsyntaxhighlight lang="perl">my $val = 0;
do {
$val++;
print "$val\n";
} until ($val % 6 == 0);</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
<!--<syntaxhighlight lang="phix">-->
{{works with|Rakudo Star|2010.08}}
<span style="color: #004080;">integer</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">x</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">x</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</syntaxhighlight>-->
 
=={{header|Phixmonti}}==
<lang perl6>my $val = 0;
<syntaxhighlight lang="Phixmonti">/# Rosetta Code problem: https://rosettacode.org/wiki/Loops/Do-while
repeat {
by Galileo, 11/2022 #/
say ++$val;
} while $val % 6;</lang>
 
include ..\Utilitys.pmt
<code>repeat ... until ''condition''</code> is equivalent to <code>do ... while not ''condition''</code>.
 
0
<lang perl6>my $val = 0;
true while
repeat {
say1 ++$val;
dup ?
} until $val %% 6;</lang>
dup 6 mod
(Here we've used <code>%%</code>, the "divisible-by" operator.)
endwhile</syntaxhighlight>
<p>
You can also put the condition before the block, without changing the order of evaluation.
 
=={{header|PHL}}==
<lang perl6>my $val = 0;
 
repeat while $val % 6 {
<syntaxhighlight lang="phl">var i = 0;
say ++$val;
do {
}</lang>
i = i::inc;
printf("%i\n", i);
} while (i%6 != 0);</syntaxhighlight>
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">$val = 0;
do {
$val++;
print "$val\n";
} while ($val % 6 != 0);</langsyntaxhighlight>
 
=={{header|Picat}}==
===do while loop===
<syntaxhighlight lang="picat">go =>
N = 0,
do
N := N+1,
println(N)
while (N mod 6 != 0).</syntaxhighlight>
 
===Recursion===
<syntaxhighlight lang="picat">go2 =>
do_while(0).
 
do_while(N) :-
N1 = N + 1,
println(N1),
N1 mod 6 != 0,
do_while(N1).</syntaxhighlight>
 
Both outputs the same.
{{out}}
<pre>1
2
3
4
5
6</pre>
 
 
=={{header|PicoLisp}}==
Literally:
<langsyntaxhighlight PicoLisplang="picolisp">(let Val 0
(loop
(println (inc 'Val))
(T (=0 (% Val 6))) ) )</langsyntaxhighlight>
Shorter:
<langsyntaxhighlight PicoLisplang="picolisp">(let Val 0
(until (=0 (% (println (inc 'Val)) 6))) )</langsyntaxhighlight>
or:
<langsyntaxhighlight PicoLisplang="picolisp">(for (Val 0 (n0 (% (println (inc 'Val)) 6))))</langsyntaxhighlight>
 
=={{header|Pike}}==
<langsyntaxhighlight lang="pike">int main(){
int value = 0;
do {
Line 726 ⟶ 2,598:
write(value + "\n");
} while (value % 6);
}</langsyntaxhighlight>
 
=={{header|PL/0}}==
PL/0 does not have a <code>do .. while</code> construct. Equivalent using <code>while</code>:
<syntaxhighlight lang="pascal">
var i;
begin
i := 0;
i := i + 1;
! i;
while (i / 6) * 6 <> i do
begin
i := i + 1;
! i
end;
end.
</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">
dcl value fixed bin (31) init (0);
do forever;
Line 739 ⟶ 2,636:
put list (value);
end;
</syntaxhighlight>
</lang>
or shorter:
<syntaxhighlight lang="pli">
dcl value fixed bin(31) init(0);
do Until(value=6);
value+=1;
put Skip list(value);
end;</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
=={{header|Plain English}}==
Plain English has one kind of loop: an infinite loop with (hopefully) a conditional break/exit. So if you want a do-while, put the conditional break/exit at the end of the loop.
<syntaxhighlight lang="plainenglish">To run:
Start up.
Demonstrate do-while.
Wait for the escape key.
Shut down.
 
To demonstrate do-while:
Bump a counter.
Convert the counter to a string.
Write the string on the console.
If the counter is evenly divisible by 6, exit.
Repeat.</syntaxhighlight>
 
=={{header|Pop11}}==
<langsyntaxhighlight lang="pop11">lvars val = 0;
while true do
val + 1 -> val;
printf(val, '%p\n');
quitif(val rem 6 = 0);
endwhile;</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">$n = 0
do {
$n++
$n
} while ($n % 6 -ne 0)</langsyntaxhighlight>
 
=={{header|Prolog}}==
<langsyntaxhighlight lang="prolog">
% initial condition
do(0):- write(0),nl,do(1).
Line 773 ⟶ 2,701:
do(0).
 
</syntaxhighlight>
</lang>
 
=={{header|PureBasic}}==
{{works with|PureBasic|4.41}}
<lang PureBasic>x=0
Repeat
x+1
Debug x
Until x%6=0</lang>
 
=={{header|Python}}==
Python doesn't have a do-while loop.
<langsyntaxhighlight lang="python">val = 0
while True:
val +=1
print val
if val % 6 == 0: break</langsyntaxhighlight>
or repeat the body of the loop before a standard while.
<langsyntaxhighlight lang="python">val = 1
print val
while val % 6 != 0:
val += 1
print val</langsyntaxhighlight>
 
=={{header|Quackery}}==
Quackery's control flow words are mix-and-match. To satisfy this task, we can check for the exit condition at the end of the loop. <code>until</code> means <tt>jump to <code>[</code> if ToS is false</tt>.
<syntaxhighlight lang="quackery">0 [ 1+ dup echo cr
dup 6 mod 0 = until ] drop</syntaxhighlight>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">i <- 0
repeat
{
Line 804 ⟶ 2,729:
print(i)
if(i %% 6 == 0) break
}</langsyntaxhighlight>
 
=={{header|Racket}}==
Idiomatic Racket code is functional:
<syntaxhighlight lang="racket">
#lang racket
(let loop ([n 0])
(let ([n (add1 n)])
(displayln n)
(unless (zero? (modulo n 6)) (loop n))))
</syntaxhighlight>
 
But an imperative version is easy to do too:
<syntaxhighlight lang="racket">
#lang racket
(define n 0)
(let loop ()
(set! n (add1 n))
(displayln n)
(unless (zero? (modulo n 6)) (loop)))
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo Star|2010.08}}
 
<syntaxhighlight lang="raku" line>my $val = 0;
repeat {
say ++$val;
} while $val % 6;</syntaxhighlight>
 
<code>repeat ... until ''condition''</code> is equivalent to <code>do ... while not ''condition''</code>.
 
<syntaxhighlight lang="raku" line>my $val = 0;
repeat {
say ++$val;
} until $val %% 6;</syntaxhighlight>
(Here we've used <code>%%</code>, the "divisible-by" operator.)
<p>
You can also put the condition before the block, without changing the order of evaluation.
 
<syntaxhighlight lang="raku" line>my $val = 0;
repeat while $val % 6 {
say ++$val;
}</syntaxhighlight>
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">REBOL [
Title: "Loop/While"
Author: oofoe
Date: 2009-12-19
URL: http://rosettacode.org/wiki/Loop/Do_While
]
Line 823 ⟶ 2,790:
 
0 = mod value 6
]</langsyntaxhighlight>
 
Output:
 
{{out}}
<pre>1
2
Line 833 ⟶ 2,799:
5
6</pre>
 
=={{header|Red}}==
<syntaxhighlight lang="red">Red []
i: 0
until [
?? i
i: i + 1
i % 6 = 0 ;; loop , until this is true...
]
</syntaxhighlight>{{out}}
<pre>i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
</pre>
 
=={{header|REXX}}==
In the '''doDO untilUNTIL''' construct, the expression is evaluated at the end of the '''DO''' loop, even though it is written at the beginning.
<br>even though it is written at the beginning.
This insures that the DO UNTIL loop will execute at least once (as coded below).
<br>This insures that the '''DO UNTIL''' loop will execute at least once (as coded below).
<br><br>
In contrast, a '''doDO whileWHILE''' construct, the expression would be evaulatedevaluated at the beginning of the '''DO''' loop, and may cause the
<br>may cause the '''DO WHILE''' loop to not execute at all.
<br>This necessitates the use of '''DO UNTIL''' instead of '''DO WHILE'''.
<lang rexx>v=0
===version 1===
<syntaxhighlight lang="rexx">/*REXX program demonstrates a DO UNTIL construction. */
v=0
do until v//6==0 /*REXX // is the ÷ remainder.*/
v=v+1
say v
end
/*stick a fork in it, we're done.*/</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
===version 2===
<syntaxhighlight lang="rexx">/*REXX program demonstrates a DO UNTIL construction. */
 
do v=1 until v//6==0 /*REXX // is the ÷ remainder.*/
say v
end
/*stick a fork in it, we're done.*/</syntaxhighlight>
'''output''' is the same as the 1<sup>st</sup> version.<br>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
n = 0
While True
n++ See n + nl
if n % 6 = 0 exit ok
end
</syntaxhighlight>
 
=={{header|RPL}}==
do until v//6 == 0 /* // is modulus in REXX.*/
To ensure at least one loop, <code>DO</code>..<code>UNTIL</code>..<code>END</code> must be used rather than <code>WHILE</code>..<code>REPEAT</code>..<code>END</code>. To actually print (on paper) instead of pushing in the stack successive results, the <code>DUP</code> instruction inside the loop shall be replaced by <code>PR1</code>
v=v+1
≪ 0
say v
'''DO'''
end</lang>
1 + DUP
'''UNTIL''' DUP 6 MOD 0 == '''END'''
DROP
 
=={{header|Ruby}}==
Line 854 ⟶ 2,877:
! until
|-
| <langsyntaxhighlight lang="ruby">val = 0
begin
val += 1
puts val
end while val % 6 != 0</langsyntaxhighlight>
| <langsyntaxhighlight lang="ruby">val = 0
begin
val += 1
puts val
end until val % 6 == 0</langsyntaxhighlight>
|}
 
During November 2005, Yukihiro Matsumoto, the creator of Ruby, [https://web.archive.org/web/20220322235407/http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6741 regretted this loop feature] and [https://web.archive.org/web/20220322235418/http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745 suggested using Kernel#loop].
 
{| class="wikitable"
Line 872 ⟶ 2,895:
! break if
|-
| <langsyntaxhighlight lang="ruby">val = 0
loop do
val += 1
puts val
break unless val %6 != 0
end</langsyntaxhighlight>
| <langsyntaxhighlight lang="ruby">val = 0
loop do
val += 1
puts val
break if val %6 == 0
end</langsyntaxhighlight>
|}
 
All four of these examples print the numbers 1, 2, 3, 4, 5, 6.
 
=={{header|Rust}}==
 
Rust does not have a <tt>do...while</tt> loop. Instead, the keyword <tt>loop</tt> is used with a termination condition.
 
<syntaxhighlight lang="rust">let mut x = 0;
 
loop {
x += 1;
println!("{}", x);
 
if x % 6 == 0 { break; }
}</syntaxhighlight>
 
=={{header|Salmon}}==
<langsyntaxhighlight Salmonlang="salmon">variable x := 0;
do
{
Line 895 ⟶ 2,931:
x!
}
while (x % 6 != 0);</langsyntaxhighlight>
 
=={{header|SAS}}==
<langsyntaxhighlight lang="sas">/* using DO UNTIL so that the loop executes at least once */
data _null_;
n=0;
do until(mod(n,6)=0);
n= n+1;
put n;
end;
run;</langsyntaxhighlight>
 
=={{header|Sather}}==
{{trans|C}}
<langsyntaxhighlight lang="sather">class MAIN is
main is
val ::= 0;
Line 918 ⟶ 2,954:
end;
end;
end;</langsyntaxhighlight>
 
=={{header|S-BASIC}}==
S-BASIC's REPEAT..UNTIL control structure is the equivalent of a
DO..WHILE statement with the terminating test inverted.
<syntaxhighlight lang="BASIC">
rem - return n mod m
function mod(n, m = integer) = integer
end = n - (n / m) * m
 
var i = integer
i = 0
repeat
begin
i = i + 1
print i;
end
until mod(i, 6) = 0
 
end
</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 5 6
</pre>
 
=={{header|Scala}}==
{{libheader|Scala}}
<lang scala>var x=0
 
do {
===Imperative===
println(x)
<syntaxhighlight lang="scala"> {
x+=1
var (x, l) = (0, List[Int]())
} while(x%6!=0)</lang>
do {
x += 1
l :+= x // A new copy of this list with List(x) appended.
} while (x % 6 != 0)
l
}.foreach(println(_))
</syntaxhighlight>
 
===Tail recursive===
<syntaxhighlight lang="scala"> def loop(iter: Int, cond: (Int) => Boolean, accu: List[Int]): List[Int] = {
val succ = iter + 1
val temp = accu :+ succ
if (cond(succ)) loop(succ, cond, temp) else temp
}
println(loop(0, (_ % 6 != 0), Nil))</syntaxhighlight>
 
===Stream===
<syntaxhighlight lang="scala"> def loop(i: Int, cond: (Int) => Boolean): Stream[Int] = {
val succ = i + 1;
succ #:: (if (cond(succ)) loop(succ, cond) else Stream.empty)
}
loop(0, (_ % 6 != 0)).foreach(println(_))</syntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(let loop ((i 1))
(display i)
(if (positive? (modulo i 6))
(loop (+ i 1))))</langsyntaxhighlight>
 
=={{header|Scilab}}==
{{works with|Scilab|5.5.1}}
<syntaxhighlight lang="text">v=0
while %T
v=v+1
printf("%2d ",v)
if modulo(v,6)==0 then break; end
end
printf("\n")</syntaxhighlight>
{{out}}
<pre> 1 2 3 4 5 6 </pre>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 944 ⟶ 3,038:
writeln(number)
until number rem 6 = 0
end func;</langsyntaxhighlight>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">var value = 0;
do {
say ++value;
} while (value % 6);</syntaxhighlight>
 
=={{header|Slate}}==
<langsyntaxhighlight lang="slate">[| val |
val: 0.
[val: val + 1.
print: val.
val \\ 6 ~= 0] whileTrue
] do.</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
 
<syntaxhighlight lang="smalltalk">|val|
val := 0.
[
val := val + 1.
val displayNl.
] doWhile: [ (val rem: 6) ~= 0 ]</syntaxhighlight>
 
<syntaxhighlight lang="smalltalk">|val|
val := 0.
[
val := val + 1.
val displayNl.
] doUntil: [ (val rem: 6) == 0 ]</syntaxhighlight>
 
To simulate the do-while construct, we can use the
<tt>whileTrue:</tt> method of a block with a void while block.
<langsyntaxhighlight lang="smalltalk">|val|
val := 0.
[
Line 963 ⟶ 3,078:
val displayNl.
(val rem: 6) ~= 0
] whileTrue: [ ]</langsyntaxhighlight>
 
Or send the loop block a <tt>whileTrue</tt> message (without argument).
<syntaxhighlight lang="smalltalk">|val|
val := 0.
[
val := val + 1.
val displayNl.
(val rem: 6) ~= 0
] whileTrue</syntaxhighlight>
 
Corresponding false-checking messages are <tt>whileFalse:</tt> and <tt>whileFalse</tt> (without argument)
 
=={{header|Sparkling}}==
<syntaxhighlight lang="sparkling">var i = 0;
do {
print(++i);
} while (i % 6 != 0);</syntaxhighlight>
 
=={{header|Spin}}==
{{works with|BST/BSTC}}
{{works with|FastSpin/FlexSpin}}
{{works with|HomeSpun}}
{{works with|OpenSpin}}
<syntaxhighlight lang="spin">con
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
 
obj
ser : "FullDuplexSerial.spin"
 
pub main | n
ser.start(31, 30, 0, 115200)
 
n := 0
repeat
n += 1
ser.dec(n)
ser.tx(32)
while n // 6
 
waitcnt(_clkfreq + cnt)
ser.stop
cogstop(0)</syntaxhighlight>
{{out}}
<pre>1 2 3 4 5 6 </pre>
 
=={{header|SPL}}==
<syntaxhighlight lang="spl">n = 0
>
n += 1
#.output(n)
< n%6</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
 
=={{header|Stata}}==
Stata macro language has no do/while loop, but it's possible to achieve this with a '''[https://www.stata.com/help.cgi?while while]''' loop.
 
Use a flag to force the first loop. It's changed in the loop so that it will have no effect after the first loop.
 
<syntaxhighlight lang="stata">local n 0
local q 1
while `q' | mod(`n',6) {
local q 0
di `++n'
}</syntaxhighlight>
 
Use an infinite while loop and do the test with an ''[https://www.stata.com/help.cgi?if if]''' at the end of the loop.
 
<syntaxhighlight lang="stata">local n 0
while 1 {
di `++n'
if mod(`n',6)==0 continue, break
}</syntaxhighlight>
 
=== Mata ===
Mata has a '''[https://www.stata.com/help.cgi?m2_do do/while]''' loop:
 
<syntaxhighlight lang="text">mata
n=0
do {
printf("%f\n",++n)
} while (mod(n,6))
end</syntaxhighlight>
 
=={{header|Suneido}}==
<langsyntaxhighlight Suneidolang="suneido">val = 0
do
{
Print(++val)
} while (val % 6 isnt 0)</langsyntaxhighlight>
 
{{out}}
Output:
<pre>1
 
<lang Suneido>1
2
3
4
5
6</langpre>
 
=={{header|Swift}}==
{{works with|Swift|3.x+}}
<syntaxhighlight lang="swift">var val = 0
repeat {
val += 1
print(val)
} while val % 6 != 0</syntaxhighlight>
{{works with|Swift|2.x}}
<syntaxhighlight lang="swift">var val = 0
repeat {
val++
print(val)
} while val % 6 != 0</syntaxhighlight>
{{works with|Swift|1.x}}
<syntaxhighlight lang="swift">var val = 0
do {
val++
println(val)
} while val % 6 != 0</syntaxhighlight>
 
=={{header|Tailspin}}==
In Tailspin you can loop by sending a value back to the matchers (by "-> #"). Depending on how you set that up, you create different loops.
<syntaxhighlight lang="tailspin">
templates doWhile
0 -> #
<> def val: $ + 1;
$val -> !OUT::write
$val -> \(<?($ mod 6 <~=0>)> $!\) -> #
end doWhile
</syntaxhighlight>
 
=={{header|Tcl}}==
Tcl does not have a built-in <code>do...while</code> construct. This example demonstrates the ease of creating new looping contructs in plain Tcl. <code>do</code> procedure taken from [http://wiki.tcl.tk/3603 Tcler's wiki]
<langsyntaxhighlight lang="tcl">proc do {body keyword expression} {
if {$keyword eq "while"} {
set expression "!($expression)"
Line 1,000 ⟶ 3,236:
 
set i 0
do {puts [incr i]} while {$i % 6 != 0}</langsyntaxhighlight>
{{tcllib|control}}
<langsyntaxhighlight lang="tcl">package require control
set i 0; control::do {puts [incr i]} while {$i % 6 != 0}
set i 0; control::do {puts [incr i]} until {$i % 6 == 0}</langsyntaxhighlight>
 
Mind you, it is also normal to write this task using a normal <code>while</code> as:
<langsyntaxhighlight lang="tcl">set i 0
while true {
puts [incr i]
if {$i % 6 == 0} break
}</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
var=0
Line 1,022 ⟶ 3,258:
IF (rest==0) EXIT
ENDLOOP
</syntaxhighlight>
</lang>
{{out}}
Output:
<pre>
1
Line 1,037 ⟶ 3,273:
{{works with|pdksh}}
{{works with|zsh}}
<langsyntaxhighlight lang="bash">val=0
while true; do
echo $((++val))
[ $((val%6)) -eq 0 ] && break
done</langsyntaxhighlight>
 
{{works with|Bourne Shell}}
<langsyntaxhighlight lang="bash">val=0
while true; do
val=`expr $val + 1`
echo $val
expr $val % 6 = 0 >/dev/null && break
done</langsyntaxhighlight>
 
{{works with|zsh}}
<syntaxhighlight lang="bash">for ((val=1;;val++)) {
print $val
(( val % 6 )) || break
}</syntaxhighlight>
 
=={{header|Vala}}==
<syntaxhighlight lang="vala"> int a = 0;
 
do {
a++;
print(a.to_string() + "\n");
}
while ( a % 6 != 0);
</syntaxhighlight>
 
=={{header|Vedit macro language}}==
<langsyntaxhighlight lang="vedit">#1 = 0
do {
#1++
Num_Type(#1)
} while (#1 % 6 != 0);</langsyntaxhighlight>
 
=={{header|Visual Basic .NETVerbexx}}==
<syntaxhighlight lang="verbexx">// Basic @LOOP until: verb
<lang vbnet>Dim i = 0
 
Do
@LOOP init:{@VAR n = 0} until:(n % 6 == 0)
i += 1
{
Console.WriteLine(i)
n++;
Loop Until i Mod 6 = 0</lang>
@SAY n;
};</syntaxhighlight>
 
=={{header|Verilog}}==
<syntaxhighlight lang="verilog">
module main;
integer i;
 
initial begin
i = 1;
 
$write(i);
while(i % 6 != 0) begin
i = i + 1;
$write(i);
end
$finish ;
end
endmodule
</syntaxhighlight>
 
=={{header|V (Vlang)}}==
{{trans|go}}
There is no explicit do-while in Vlang, but it can be simulated with a range-based for loop and the break statement.
<syntaxhighlight lang="go">fn main() {
mut value := 0
for {
value++
println(value)
if value%6 != 0 {
break
}
}
}</syntaxhighlight>
{{out}}
<pre>1
2
3
4
5
6</pre>
It can also be simulated ''without'' using a break statement as follows:
<syntaxhighlight lang="vlang">fn main() {
mut value := 0
for ok := true; ok; ok = value%6 != 0 {
value++
println(value)
}
}</syntaxhighlight>
 
{{out}}
<pre>
Same as before.
</pre>
::<syntaxhighlight lang="vlang">fn main() {
// do-while loop 1
mut n1 := 2
for n1 < 6 {
n1 *= 2
}
println(n1) // prt 8
// do-while loop 2
mut n2 := 2
for ok := true; ok; ok = n2%8 != 0 {
n2 *= 2
}
println(n2) // prt 8
// do-while loop 3
mut n3 := 2
for {
n3 *= 2
if n3 >= 6 {
break
}
}
println(n3) // prt 8
}</syntaxhighlight>
 
=={{header|Wren}}==
Wren doesn't have a ''do/while'' loop as such but we can simulate it using an infinite loop with a final conditional break.
<syntaxhighlight lang="wren">var v = 0
while (true) {
v = v + 1
System.print(v)
if (v%6 == 0) break
}</syntaxhighlight>
{{out}}
<pre>
1
2
3
4
5
6
</pre>
It can also be simulated ''without'' using a break statement as follows:
<syntaxhighlight lang="wren">var value = 0
var ok = true
while (ok) {
value = value + 1
System.print(value)
ok = value%6 != 0
}</syntaxhighlight>
 
{{out}}
<pre>
Same as before.
</pre>
 
=={{header|X86 Assembly}}==
{{works with|nasm}}
{{works with|windows}}
<syntaxhighlight lang="asm">
extern _printf
 
section .data
output db 0,0
section .text
global _main
_main:
mov bl, 0
looping:
add bl, 0x31 ;0x30 to 0x39 is 0 to 9 in ASCII
mov [output], bl
sub bl, 0x30
push output
call _printf
add esp, 4
xor eax, eax
xor edx, edx
mov al, bl
mov ecx, 6
div ecx ; remainder is saved in edx
cmp edx, 0
jne looping ; if n & 6 != 0 do looping again
xor eax, eax
ret
</syntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">code CrLf=9, IntOut=11;
int V;
[V:= 0;
Line 1,072 ⟶ 3,463:
IntOut(0, V); CrLf(0);
until rem(V/6) = 0;
]</langsyntaxhighlight>
 
=={{header|Yorick}}==
<langsyntaxhighlight lang="yorick">val = 0;
do {
val++;
write, val;
} while(val % 6 != 0);</langsyntaxhighlight>
 
=={{header|zkl}}==
{{trans|Yorick}}
<syntaxhighlight lang="zkl">val := 0;
do {
val+=1;
val.print(" ");
} while(val % 6 != 0);</syntaxhighlight>
{{out}}
<pre>
1 2 3 4 5 6
</pre>
 
=={{header|Zig}}==
<syntaxhighlight lang="zig">const std = @import("std");
 
pub fn main() !void {
var a: u8 = 0;
// no do-while in syntax, trust the optimizer to do
// correct Loop inversion https://en.wikipedia.org/wiki/Loop_inversion
// If the variable `alive` is independent to other variables and not in
// diverging control flow, then the optimization is possible in general.
var alive = true;
while (alive == true or a % 6 != 0) {
alive = false;
a += 1;
try std.io.getStdOut().writer().print("{d}\n", .{a});
}
}</syntaxhighlight>
 
{{omit from|GUISS}}