Loops/Do-while: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|GW-BASIC}}: "Each time through the loop, add 1 to the value _then_ print it.")
m (Moved Wren entry into correct alphabetical order.)
(44 intermediate revisions by 24 users not shown)
Line 34: Line 34:
{{trans|Python}}
{{trans|Python}}


<lang 11l>V val = 0
<syntaxhighlight lang="11l">V val = 0
L
L
val++
val++
print(val)
print(val)
I val % 6 == 0
I val % 6 == 0
L.break</lang>
L.break</syntaxhighlight>


=={{header|360 Assembly}}==
=={{header|360 Assembly}}==
;Basic
;Basic
The WTO macro is in SYS1.MACLIB, which needs to be in the SYSLIB concatenation at assembly.
The WTO macro is in SYS1.MACLIB, which needs to be in the SYSLIB concatenation at assembly.
<lang 360asm>* Do-While
<syntaxhighlight lang="360asm">* Do-While
DOWHILE CSECT , This program's control section
DOWHILE CSECT , This program's control section
BAKR 14,0 Caller's registers to linkage stack
BAKR 14,0 Caller's registers to linkage stack
Line 70: Line 70:
WTOLEN DC H'2' fixed WTO length of two
WTOLEN DC H'2' fixed WTO length of two
WTOTXT DC CL2' '
WTOTXT DC CL2' '
END DOWHILE </lang>
END DOWHILE </syntaxhighlight>
;Structured Macros
;Structured Macros
Although specified at the beginning (DO UNTIL), the test is done at the end of the loop (ENDDO).
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.
Structured macros (DO ENDDO) weren't in the 1963 standard of Assembler 360, but there are part of it since since 1998.
<lang 360asm>* Do-While 27/06/2016
<syntaxhighlight lang="360asm">* Do-While 27/06/2016
DOWHILE CSECT
DOWHILE CSECT
USING DOWHILE,12 set base register
USING DOWHILE,12 set base register
Line 94: Line 94:
DC H'0' must be zero
DC H'0' must be zero
WTOTXT DS C one char
WTOTXT DS C one char
END DOWHILE</lang>
END DOWHILE</syntaxhighlight>


=={{header|6502 Assembly}}==
=={{header|6502 Assembly}}==
Code is called as a subroutine (i.e. JSR DoWhileSub). Specific OS/hardware routines for printing are left unimplemented.
Code is called as a subroutine (i.e. JSR DoWhileSub). Specific OS/hardware routines for printing are left unimplemented.
<lang 6502asm>DoWhileSub: PHA
<syntaxhighlight lang="6502asm">DoWhileSub: PHA
TYA
TYA
PHA ;push accumulator and Y register onto stack
PHA ;push accumulator and Y register onto stack
Line 115: Line 115:
TAY
TAY
PLA ;restore Y register and accumulator from stack
PLA ;restore Y register and accumulator from stack
RTS ;return from subroutine</lang>
RTS ;return from subroutine</syntaxhighlight>
=={{header|AArch64 Assembly}}==
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program loopdowhile64.s */
/* program loopdowhile64.s */
Line 173: Line 173:
.include "../includeARM64.inc"
.include "../includeARM64.inc"


</syntaxhighlight>
</lang>




=={{header|Action!}}==
=={{header|Action!}}==
<lang Action!>Proc Main()
<syntaxhighlight lang="action!">Proc Main()
byte A
byte A


Line 186: Line 186:
Until A Mod 6=0
Until A Mod 6=0
Od
Od
Return</lang>
Return</syntaxhighlight>


=={{header|ActionScript}}==
=={{header|ActionScript}}==
<lang actionscript>var val:int = 0;
<syntaxhighlight lang="actionscript">var val:int = 0;
do
do
{
{
trace(++val);
trace(++val);
} while (val % 6);</lang>
} while (val % 6);</syntaxhighlight>


=={{header|Ada}}==
=={{header|Ada}}==
<lang ada>loop
<syntaxhighlight lang="ada">loop
Value := Value + 1;
Value := Value + 1;
Put (Value);
Put (Value);
exit when Value mod 6 = 0;
exit when Value mod 6 = 0;
end loop;</lang>
end loop;</syntaxhighlight>
Here is an alternative version:
Here is an alternative version:
<lang ada>for Value in 0..Integer'Last loop
<syntaxhighlight lang="ada">for Value in 0..Integer'Last loop
Put (Value);
Put (Value);
exit when Value mod 6 = 0;
exit when Value mod 6 = 0;
end loop;</lang>
end loop;</syntaxhighlight>


=={{header|Agena}}==
=={{header|Agena}}==
Tested with Agena 2.9.5 Win32
Tested with Agena 2.9.5 Win32
<lang agena>scope
<syntaxhighlight lang="agena">scope
local i := 0;
local i := 0;
do
do
Line 215: Line 215:
print( i )
print( i )
as ( i % 6 ) <> 0
as ( i % 6 ) <> 0
epocs</lang>
epocs</syntaxhighlight>


=={{header|Aime}}==
=={{header|Aime}}==
<lang aime>integer a;
<syntaxhighlight lang="aime">integer a;


a = 0;
a = 0;
Line 225: Line 225:
o_integer(a);
o_integer(a);
o_byte('\n');
o_byte('\n');
} while (a % 6 != 0);</lang>
} while (a % 6 != 0);</syntaxhighlight>


=={{header|ALGOL 60}}==
=={{header|ALGOL 60}}==
{{works with|ALGOL 60|OS/360}}
{{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.
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.
<lang algol60>'BEGIN' 'COMMENT' Loops DoWhile - Algol60 - 22/06/2018;
<syntaxhighlight lang="algol60">'BEGIN' 'COMMENT' Loops DoWhile - Algol60 - 22/06/2018;
'INTEGER' I;
'INTEGER' I;
I:=0;
I:=0;
Line 239: Line 239:
'GOTO' LOOP;
'GOTO' LOOP;
ENDLOOP:
ENDLOOP:
'END'</lang>
'END'</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 248: Line 248:
{{works with|A60}}
{{works with|A60}}
While "goto" may (oddly enough) actually be clearer in this particular context, it is possible to avoid it by using the for-while statement and a boolean flag to implement a test-at-the-bottom loop. (Note that though the A60 interpreter permits, it thankfully does not require, the ugly tick marks around reserved words which mar many (but not the Burroughs) ALGOL 60 translators.)
While "goto" may (oddly enough) actually be clearer in this particular context, it is possible to avoid it by using the for-while statement and a boolean flag to implement a test-at-the-bottom loop. (Note that though the A60 interpreter permits, it thankfully does not require, the ugly tick marks around reserved words which mar many (but not the Burroughs) ALGOL 60 translators.)
<lang algol60>
<syntaxhighlight lang="algol60">
begin
begin


Line 263: Line 263:


end
end
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 270: Line 270:


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
<lang algol68>FOR value WHILE
<syntaxhighlight lang="algol68">FOR value WHILE
print(value);
print(value);
# WHILE # value MOD 6 /= 0 DO
# WHILE # value MOD 6 /= 0 DO
SKIP
SKIP
OD</lang>
OD</syntaxhighlight>


=={{header|ALGOL W}}==
=={{header|ALGOL W}}==
<lang algolw>begin
<syntaxhighlight lang="algolw">begin
integer i;
integer i;
i := 0;
i := 0;
Line 287: Line 287:
end
end
do begin end
do begin end
end.</lang>
end.</syntaxhighlight>


=={{header|AmigaE}}==
=={{header|AmigaE}}==
<lang amigae>PROC main()
<syntaxhighlight lang="amigae">PROC main()
DEF i = 0
DEF i = 0
REPEAT
REPEAT
Line 296: Line 296:
WriteF('\d\n', i)
WriteF('\d\n', i)
UNTIL Mod(i, 6) = 0
UNTIL Mod(i, 6) = 0
ENDPROC</lang>
ENDPROC</syntaxhighlight>


=={{header|ARM Assembly}}==
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>


/* ARM assembly Raspberry PI */
/* ARM assembly Raspberry PI */
Line 442: Line 442:
pop {r4, lr}
pop {r4, lr}
bx lr
bx lr
</syntaxhighlight>
</lang>


=={{header|AppleScript}}==
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">
<lang AppleScript>
on printConsole(x)
on printConsole(x)
return x as string
return x as string
Line 456: Line 456:
printConsole(table)
printConsole(table)
end repeat
end repeat
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 470: Line 470:
=={{header|Arturo}}==
=={{header|Arturo}}==


<lang rebol>value: 0
<syntaxhighlight lang="rebol">value: 0
until [
until [
value: value + 1
value: value + 1
print value
print value
] [ 0 = value%6 ]</lang>
] [ 0 = value%6 ]</syntaxhighlight>


{{out}}
{{out}}
Line 484: Line 484:
5
5
6</pre>
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}}==
=={{header|AutoHotkey}}==
<lang AutoHotkey>While mod(A_Index, 6) ;comment:everything but 0 is considered true
<syntaxhighlight lang="autohotkey">While mod(A_Index, 6) ;comment:everything but 0 is considered true
output = %output%`n%A_Index%
output = %output%`n%A_Index%
MsgBox % output</lang>
MsgBox % output</syntaxhighlight>


=={{header|AWK}}==
=={{header|AWK}}==
<lang awk>BEGIN {
<syntaxhighlight lang="awk">BEGIN {
val = 0
val = 0
do {
do {
Line 497: Line 505:
print val
print val
} while( val % 6 != 0)
} while( val % 6 != 0)
}</lang>
}</syntaxhighlight>


=={{header|Axe}}==
=={{header|Axe}}==
While Axe does not have explicit do-while loops, they can be easily emulated using an infinite loop with a conditional terminator:
While Axe does not have explicit do-while loops, they can be easily emulated using an infinite loop with a conditional terminator:
<lang axe>0→A
<syntaxhighlight lang="axe">0→A
While 1
While 1
A++
A++
Disp A▶Dec,i
Disp A▶Dec,i
End!If A^6</lang>
End!If A^6</syntaxhighlight>


=={{header|BASIC}}==
=={{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
do
1 DEF FN MOD6(N) = N - INT (N / 6) * 6
a = a + 1
2 LET V4LUE = 0
print a
3 FOR DO = 0 TO 1
loop while a mod 6 <> 0</lang>
10 LET V4LUE = V4LUE + 1
20 PRINT V4LUE" ";
30 WHILE = FN MOD6(V4LUE) < > 0:DO = NOT WHILE: NEXT</syntaxhighlight>


==={{header|ASIC}}===
==={{header|ASIC}}===
ASIC does not have a <code>do .. while</code> construct. Equivalent using <code>WHILE</code>:
ASIC does not have a <code>do .. while</code> construct. Equivalent using <code>WHILE</code>:
<lang basic>
<syntaxhighlight lang="basic">
REM Loops/Do-while
REM Loops/Do-while


Line 532: Line 543:


END
END
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 543: Line 554:
</pre>
</pre>
Equivalent using conditional jump:
Equivalent using conditional jump:
<lang basic>
<syntaxhighlight lang="basic">
REM Loops/Do-while
REM Loops/Do-while


Line 554: Line 565:


END
END
</syntaxhighlight>
</lang>
{{out}}
{{out}}
As above
As above


==={{header|BaCon}}===
==={{header|BaCon}}===
<lang freebasic>
<syntaxhighlight lang="freebasic">
a=0
a=0
REPEAT
REPEAT
Line 565: Line 576:
PRINT a
PRINT a
UNTIL MOD(a,6) == 0
UNTIL MOD(a,6) == 0
</syntaxhighlight>
</lang>


==={{header|BASIC256}}===
==={{header|BASIC256}}===
<lang BASIC256>i = 0
<syntaxhighlight lang="basic256">i = 0


do
do
Line 575: Line 586:
until i mod 6 = 0
until i mod 6 = 0
print
print
end</lang>
end</syntaxhighlight>


==={{header|BBC BASIC}}===
==={{header|BBC BASIC}}===
<lang bbcbasic>a = 0
<syntaxhighlight lang="bbcbasic">a = 0
REPEAT
REPEAT
a = a + 1
a = a + 1
PRINT a
PRINT a
UNTIL a MOD 6 = 0</lang>
UNTIL a MOD 6 = 0</syntaxhighlight>

==={{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}}===
==={{header|IS-BASIC}}===
<lang IS-BASIC>100 LET I=0
<syntaxhighlight lang="is-basic">100 LET I=0
110 DO
110 DO
120 LET I=I+1
120 LET I=I+1
130 PRINT I
130 PRINT I
140 LOOP UNTIL MOD(I,6)=0</lang>
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}}===
==={{header|Sinclair ZX81 BASIC}}===
<lang basic>10 LET X=0
<syntaxhighlight lang="basic">10 LET X=0
20 LET X=X+1
20 LET X=X+1
30 PRINT X
30 PRINT X
40 IF X/6<>INT (X/6) THEN GOTO 20</lang>
40 IF X/6<>INT (X/6) THEN GOTO 20</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}}===
==={{header|True BASIC}}===
<lang basic>
<syntaxhighlight lang="basic">LET i = 0
LET i = 0


DO
DO
Line 606: Line 854:
LOOP WHILE REMAINDER(i, 6) <> 0
LOOP WHILE REMAINDER(i, 6) <> 0
PRINT
PRINT
END</syntaxhighlight>
END

</lang>
==={{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}}===
==={{header|Yabasic}}===
<lang yabasic>i = 0
<syntaxhighlight lang="yabasic">i = 0
repeat
repeat
Line 616: Line 897:
print i, " ";
print i, " ";
until mod(i, 6) = 0
until mod(i, 6) = 0
print</lang>
print</syntaxhighlight>


=={{header|bc}}==
=={{header|bc}}==
<lang bc>i = 0
<syntaxhighlight lang="bc">i = 0
for (;;) {
for (;;) {
++i /* increments then prints i */
++i /* increments then prints i */
if (i % 6 == 0) break
if (i % 6 == 0) break
}
}
quit</lang>
quit</syntaxhighlight>


=={{header|Befunge}}==
=={{header|Befunge}}==
<lang befunge>0>1+:.v
<syntaxhighlight lang="befunge">0>1+:.v
|%6: <
|%6: <
@</lang>
@</syntaxhighlight>


=={{header|C}}==
=={{header|C}}==
<lang c>int val = 0;
<syntaxhighlight lang="c">int val = 0;
do{
do{
val++;
val++;
printf("%d\n",val);
printf("%d\n",val);
}while(val % 6 != 0);</lang>
}while(val % 6 != 0);</syntaxhighlight>


=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==


<lang csharp>int a = 0;
<syntaxhighlight lang="csharp">int a = 0;


do
do
Line 646: Line 927:
a += 1;
a += 1;
Console.WriteLine(a);
Console.WriteLine(a);
} while (a % 6 != 0);</lang>
} while (a % 6 != 0);</syntaxhighlight>


=={{header|C++}}==
=={{header|C++}}==
<lang cpp>int val = 0;
<syntaxhighlight lang="cpp">int val = 0;
do{
do{
val++;
val++;
std::cout << val << std::endl;
std::cout << val << std::endl;
}while(val % 6 != 0);</lang>
}while(val % 6 != 0);</syntaxhighlight>

=={{header|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}}==
=={{header|Chapel}}==
<lang chapel>var val = 0;
<syntaxhighlight lang="chapel">var val = 0;
do {
do {
val += 1;
val += 1;
writeln(val);
writeln(val);
} while val % 6 > 0;</lang>
} while val % 6 > 0;</syntaxhighlight>


=={{header|ChucK}}==
=={{header|ChucK}}==
<lang>
<syntaxhighlight lang="text">
0 => int value;
0 => int value;
do
do
Line 671: Line 961:
}
}
while(value % 6 != 0);
while(value % 6 != 0);
</syntaxhighlight>
</lang>


=={{header|Clipper}}==
=={{header|Clipper}}==
<lang clipper> Local n := 0
<syntaxhighlight lang="clipper"> Local n := 0
DO WHILE .T.
DO WHILE .T.
? ++n
? ++n
Line 680: Line 970:
EXIT
EXIT
ENDIF
ENDIF
ENDDO</lang>
ENDDO</syntaxhighlight>


=={{header|Clojure}}==
=={{header|Clojure}}==
<lang Clojure>(loop [i 0]
<syntaxhighlight lang="clojure">(loop [i 0]
(let [i* (inc i)]
(let [i* (inc i)]
(println i*)
(println i*)
(when-not (zero? (mod i* 6))
(when-not (zero? (mod i* 6))
(recur i*))))</lang>
(recur i*))))</syntaxhighlight>


=={{header|COBOL}}==
=={{header|COBOL}}==
The COBOL equivalent of a do-while loop is <code>PERFORM WITH TEST AFTER UNTIL some-condition</code>.
The COBOL equivalent of a do-while loop is <code>PERFORM WITH TEST AFTER UNTIL some-condition</code>.
<lang cobol> IDENTIFICATION DIVISION.
<syntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. loop-do-while.
PROGRAM-ID. loop-do-while.


Line 705: Line 995:


GOBACK
GOBACK
.</lang>
.</syntaxhighlight>


=={{header|Coco}}==
=={{header|Coco}}==
Do-while loops are a JavaScript feature removed in CoffeeScript but re-added in Coco.
Do-while loops are a JavaScript feature removed in CoffeeScript but re-added in Coco.


<lang coco>v = 0
<syntaxhighlight lang="coco">v = 0
do
do
console.log ++v
console.log ++v
while v % 6</lang>
while v % 6</syntaxhighlight>


=={{header|CoffeeScript}}==
=={{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.
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.
<lang coffeescript>val = 0
<syntaxhighlight lang="coffeescript">val = 0
loop
loop
console.log ++val
console.log ++val
break unless val % 6</lang>
break unless val % 6</syntaxhighlight>


=={{header|ColdFusion}}==
=={{header|ColdFusion}}==
<lang cfm><cfscript>
<syntaxhighlight lang="cfm"><cfscript>
value = 0;
value = 0;
do
do
Line 730: Line 1,020:
writeOutput( value );
writeOutput( value );
} while( value % 6 != 0 );
} while( value % 6 != 0 );
</cfscript></lang>
</cfscript></syntaxhighlight>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
<lang lisp>(let ((val 0))
<syntaxhighlight lang="lisp">(let ((val 0))
(loop do
(loop do
(incf val)
(incf val)
(print val)
(print val)
while (/= 0 (mod val 6))))</lang>
while (/= 0 (mod val 6))))</syntaxhighlight>


loop can set up temporary values, and incf returns a value, so it's also possible to do
loop can set up temporary values, and incf returns a value, so it's also possible to do


<lang lisp>(loop with val = 0
<syntaxhighlight lang="lisp">(loop with val = 0
do (print (incf val))
do (print (incf val))
until (= 0 (mod val 6)))</lang>
until (= 0 (mod val 6)))</syntaxhighlight>


=== Using DO ===
=== Using DO ===
<lang lisp>
<syntaxhighlight lang="lisp">
(do* ((a 0) ; Initialize to 0
(do* ((a 0) ; Initialize to 0
(b (incf a) (incf b))) ; Set first increment and increment on every loop
(b (incf a) (incf b))) ; Set first increment and increment on every loop
((zerop (mod b 6)) (print b)) ; Break condition and print last value `6' (right?)
((zerop (mod b 6)) (print b)) ; Break condition and print last value `6' (right?)
(print b)) ; On every loop print value
(print b)) ; On every loop print value
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 764: Line 1,054:


=={{header|D}}==
=={{header|D}}==
<lang d>import std.stdio;
<syntaxhighlight lang="d">import std.stdio;


void main() {
void main() {
Line 772: Line 1,062:
write(val, " ");
write(val, " ");
} while (val % 6 != 0);
} while (val % 6 != 0);
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>1 2 3 4 5 6 </pre>
<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}}==
=={{header|dc}}==
{{trans|bc}}
{{trans|bc}}
<lang dc>0 si [i = 0]sz
<syntaxhighlight lang="dc">0 si [i = 0]sz
[2Q]sA [A = code to break loop]sz
[2Q]sA [A = code to break loop]sz
[
[
Line 785: Line 1,085:
6 % 0 =A [call A if 0 == it % 6]sz
6 % 0 =A [call A if 0 == it % 6]sz
0 0 =B [continue loop]sz
0 0 =B [continue loop]sz
]sB 0 0 =B</lang>
]sB 0 0 =B</syntaxhighlight>


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


{$APPTYPE CONSOLE}
{$APPTYPE CONSOLE}
Line 803: Line 1,103:
Writeln;
Writeln;
Readln;
Readln;
end.</lang>
end.</syntaxhighlight>


=={{header|Draco}}==
=={{header|Draco}}==
<lang draco>proc nonrec main() void:
<syntaxhighlight lang="draco">proc nonrec main() void:
byte i;
byte i;
i := 0;
i := 0;
Line 814: Line 1,114:
i % 6 ~= 0
i % 6 ~= 0
do od
do od
corp</lang>
corp</syntaxhighlight>
{{out}}
{{out}}
<pre> 1 2 3 4 5 6</pre>
<pre> 1 2 3 4 5 6</pre>
Line 820: Line 1,120:
=={{header|Dragon}}==
=={{header|Dragon}}==


<lang dragon>val = 0
<syntaxhighlight lang="dragon">val = 0
do{
do{
val++
val++
showln val
showln val
}while(val % 6 != 0)</lang>
}while(val % 6 != 0)</syntaxhighlight>


=={{header|DUP}}==
=={{header|DUP}}==
Line 831: Line 1,131:
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):
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):


<lang DUP>[1+$.' ,]⇒A {operator definition: PUSH 1, ADD, DUP, print top of stack to SDTOUT, print whitespace}
<syntaxhighlight lang="dup">[1+$.' ,]⇒A {operator definition: PUSH 1, ADD, DUP, print top of stack to SDTOUT, print whitespace}
[1+$.' ,]a: {function definition}</lang>
[1+$.' ,]a: {function definition}</syntaxhighlight>


and put the defined block in front of the while loop, and inside the while loop itself:
and put the defined block in front of the while loop, and inside the while loop itself:
Line 838: Line 1,138:
If the block was defined as an operator, the whole program would look like this (comments in curly braces):
If the block was defined as an operator, the whole program would look like this (comments in curly braces):


<lang DUP>[1+$.' ,]⇒A
<syntaxhighlight lang="dup">[1+$.' ,]⇒A
0 A[$6/%][A]# {PUSH 0, execute operator A, [DUP, PUSH 6, MOD/DIV, POP][execute operator A]#}</lang>
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:
And if the block is defined as a named function:


<lang DUP>[1+$.' ,]a:
<syntaxhighlight lang="dup">[1+$.' ,]a:
0 a;![$6/%][a;!]#</lang>
0 a;![$6/%][a;!]#</syntaxhighlight>


Result:
Result:


<lang DUP>1 2 3 4 5 6</lang>
<syntaxhighlight lang="dup">1 2 3 4 5 6</syntaxhighlight>


=={{header|DWScript}}==
=={{header|DWScript}}==
<syntaxhighlight lang="delphi">
<lang Delphi>
var i := 0;
var i := 0;


Line 858: Line 1,158:
PrintLn(i);
PrintLn(i);
until i mod 6 = 0;
until i mod 6 = 0;
</syntaxhighlight>
</lang>
'''Bold text'''
'''Bold text'''

=={{header|Dyalect}}==

<syntaxhighlight lang="dyalect">var x = 0

do
{
x += 1
print(x)
} while x % 6 != 0</syntaxhighlight>


=={{header|E}}==
=={{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.
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.
<lang e>var x := 0
<syntaxhighlight lang="e">var x := 0
__loop(fn {
__loop(fn {
x += 1
x += 1
println(x)
println(x)
x % 6 != 0 # this is the return value of the function
x % 6 != 0 # this is the return value of the function
})</lang>
})</syntaxhighlight>


<!-- XXX we should have an example of lambda-args sugar here -->
<!-- XXX we should have an example of lambda-args sugar here -->

=={{header|EasyLang}}==
EasyLang does not include an built-in do-while loop, but a repeat-until loop can be used, with the condition inside a '''not''' operator.
<syntaxhighlight lang="easylang">
value = 0
repeat
value += 1
print value
until value mod 6 = 0
.
</syntaxhighlight>


=={{header|Ela}}==
=={{header|Ela}}==


<lang ela>open monad io
<syntaxhighlight lang="ela">open monad io


loop n | n % 6 == 0 = do return ()
loop n | n % 6 == 0 = do return ()
Line 881: Line 1,202:
loop (n+1)
loop (n+1)


_ = loop 10 ::: IO</lang>
_ = loop 10 ::: IO</syntaxhighlight>


=={{header|Elixir}}==
=={{header|Elixir}}==
<lang elixir>defmodule Loops do
<syntaxhighlight lang="elixir">defmodule Loops do
def do_while(n) do
def do_while(n) do
n1 = n + 1
n1 = n + 1
Line 893: Line 1,214:
end
end


Loops.do_while(0)</lang>
Loops.do_while(0)</syntaxhighlight>


=={{header|Emacs Lisp}}==
=={{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.
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.


<lang Lisp>(let ((val 0))
<syntaxhighlight lang="lisp">(let ((val 0))
(while (progn
(while (progn
(setq val (1+ val))
(setq val (1+ val))
(message "%d" val)
(message "%d" val)
(/= 0 (mod val 6)))))</lang>
(/= 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.
Alternatively, the loop can be rewritten to check for the exit condition and fulfill it at the end of the loop body.


<lang Lisp>(let ((val 0) done)
<syntaxhighlight lang="lisp">(let ((val 0) done)
(while (not done)
(while (not done)
(setq val (1+ val))
(setq val (1+ val))
(message "%d" val)
(message "%d" val)
(setq done (zerop (mod val 6)))))</lang>
(setq done (zerop (mod val 6)))))</syntaxhighlight>


=={{header|Erlang}}==
=={{header|Erlang}}==


<syntaxhighlight lang="erlang">
<lang Erlang>
do() ->
do() ->
do(0).
do(0).
Line 926: Line 1,247:
io:fwrite( "~p ", [N] ),
io:fwrite( "~p ", [N] ),
do(N+1).
do(N+1).
</syntaxhighlight>
</lang>


=={{header|ERRE}}==
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
<lang ERRE>
A=0
A=0
REPEAT
REPEAT
Line 935: Line 1,256:
PRINT(A)
PRINT(A)
UNTIL A MOD 6=0 !UNTIL A-6*INT(A/6)=0 for C-64
UNTIL A MOD 6=0 !UNTIL A-6*INT(A/6)=0 for C-64
</syntaxhighlight>
</lang>


=={{header|Euphoria}}==
=={{header|Euphoria}}==
{{works with|Open Euphoria}}
{{works with|Open Euphoria}}
<lang euphoria>
<syntaxhighlight lang="euphoria">
include std/console.e
include std/console.e
include std/math.e
include std/math.e
Line 952: Line 1,273:


if getc(0) then end if
if getc(0) then end if
</syntaxhighlight>
</lang>


=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
If you must have a loop then this is acceptable F#
If you must have a loop then this is acceptable F#
<lang fsharp>
<syntaxhighlight lang="fsharp">
let rec loop n =
let rec loop n =
printfn "%d " n
printfn "%d " n
if (n+1)%6 > 0 then loop (n+1)
if (n+1)%6 > 0 then loop (n+1)
loop 0
loop 0
</syntaxhighlight>
</lang>


But I prefer this way:
But I prefer this way:
<lang fsharp>
<syntaxhighlight lang="fsharp">
Seq.initInfinite id |> Seq.takeWhile(fun n->n=0 || n%6>0) |> Seq.iter (fun n-> printfn "%d" n)
Seq.initInfinite id |> Seq.takeWhile(fun n->n=0 || n%6>0) |> Seq.iter (fun n-> printfn "%d" n)
</syntaxhighlight>
</lang>


Either produces:
Either produces:
Line 981: Line 1,302:
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.
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.


<lang fsharp>
<syntaxhighlight lang="fsharp">
// Loops/Do-while. Nigel Galloway: February 14th., 2022
// 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")
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>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 997: Line 1,318:


=={{header|Factor}}==
=={{header|Factor}}==
<lang factor>0 [ dup 6 mod 0 = not ] [ [ . ] [ 1 + ] bi ] do while drop</lang>
<syntaxhighlight lang="factor">0 [ dup 6 mod 0 = not ] [ [ . ] [ 1 + ] bi ] do while drop</syntaxhighlight>


=={{header|Fantom}}==
=={{header|Fantom}}==
Line 1,003: Line 1,324:
There is no do-while statement in Fantom, so instead use an infinite while loop with a break statement:
There is no do-while statement in Fantom, so instead use an infinite while loop with a break statement:


<lang fantom>
<syntaxhighlight lang="fantom">
class Main
class Main
{
{
Line 1,017: Line 1,338:
}
}
}
}
</syntaxhighlight>
</lang>


=={{header|Forth}}==
=={{header|Forth}}==
<lang forth>: do-until
<syntaxhighlight lang="forth">: do-until
0
0
begin 1+
begin 1+
Line 1,026: Line 1,347:
dup 6 mod 0=
dup 6 mod 0=
until
until
drop ;</lang>
drop ;</syntaxhighlight>


=={{header|Fortran}}==
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
{{works with|Fortran|90 and later}}
<lang fortran>INTEGER :: i = 0
<syntaxhighlight lang="fortran">INTEGER :: i = 0
DO
DO
i = i + 1
i = i + 1
WRITE(*, *) i
WRITE(*, *) i
IF (MOD(i, 6) == 0) EXIT
IF (MOD(i, 6) == 0) EXIT
END DO</lang>
END DO</syntaxhighlight>


{{works with|Fortran|77 and later}}
{{works with|Fortran|77 and later}}
<lang fortran> PROGRAM DOWHILE
<syntaxhighlight lang="fortran"> PROGRAM DOWHILE
C Initialize modulus and value.
C Initialize modulus and value.
INTEGER MODLUS, IVALUE
INTEGER MODLUS, IVALUE
Line 1,052: Line 1,373:


STOP
STOP
END</lang>
END</syntaxhighlight>


{{works with|Fortran|IV and later}}
{{works with|Fortran|IV and later}}
<lang fortran> IVALUE = 0
<syntaxhighlight lang="fortran"> IVALUE = 0
10 CONTINUE
10 CONTINUE
IVALUE=IVALUE+1
IVALUE=IVALUE+1
Line 1,061: Line 1,382:
301 FORMAT(I5)
301 FORMAT(I5)
IF(MOD(IVALUE,6).NE.0) GOTO 10
IF(MOD(IVALUE,6).NE.0) GOTO 10
END</lang>
END</syntaxhighlight>


{{works with|Fortran|I and later}}
{{works with|Fortran|I and later}}
<lang fortran> IVALUE = 0
<syntaxhighlight lang="fortran"> IVALUE = 0
10 IVALUE=IVALUE+1
10 IVALUE=IVALUE+1
WRITE 301,IVALUE
WRITE 301,IVALUE
Line 1,070: Line 1,391:
IF(IVALUE-IVALUE/6*6) 10,20,10
IF(IVALUE-IVALUE/6*6) 10,20,10
20 STOP
20 STOP
END</lang>
END</syntaxhighlight>


=={{header|Fortress}}==
=={{header|Fortress}}==
Line 1,076: Line 1,397:
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.
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.


<lang fortress>
<syntaxhighlight lang="fortress">
component loops_do_while
component loops_do_while
export Executable
export Executable
Line 1,092: Line 1,413:
end loop
end loop
end
end
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 1,102: Line 1,423:
5
5
6
6
</pre>

=={{header|FreeBASIC}}==
<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</lang>

{{out}}
<pre>
1 2 3 4 5 6
</pre>
</pre>


=={{header|Frink}}==
=={{header|Frink}}==
<lang frink>n = 0
<syntaxhighlight lang="frink">n = 0
do
do
{
{
n = n + 1
n = n + 1
println[n]
println[n]
} while n mod 6 != 0</lang>
} while n mod 6 != 0</syntaxhighlight>

=={{header|FutureBasic}}==
<lang futurebasic>
include "ConsoleWindow"

dim as long i

do
i++
print i
until ( i mod 6 == 0 )
</lang>
Output:
<pre>
1
2
3
4
5
6
</pre>

=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=57e91eab60baf7e39df9b6d16a0deddd Click this link to run this code]'''
<lang gambas>Public Sub Main()
Dim siCount As Short

Repeat
Inc siCount
Print siCount;;
Until siCount Mod 6 = 0

End</lang>
Output:
<pre>
1 2 3 4 5 6
</pre>


=={{header|GAP}}==
=={{header|GAP}}==
<lang gap>n := 0;
<syntaxhighlight lang="gap">n := 0;
repeat
repeat
n := n + 1;
n := n + 1;
Print(n, "\n");
Print(n, "\n");
until RemInt(n, 6) = 0;</lang>
until RemInt(n, 6) = 0;</syntaxhighlight>


=={{header|GML}}==
=={{header|GML}}==
<lang GML>i = 0
<syntaxhighlight lang="gml">i = 0
do
do
{
{
Line 1,179: Line 1,447:
show_message(string(i))
show_message(string(i))
}
}
until (i mod 6 = 0)</lang>
until (i mod 6 = 0)</syntaxhighlight>


=={{header|Go}}==
=={{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.
There is no explicit do-while in Go, but it can be simulated with a range-based for loop and the break statement.
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,196: Line 1,464:
}
}
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>1
<pre>1
Line 1,205: Line 1,473:
6</pre>
6</pre>
It can also be simulated ''without'' using a break statement as follows:
It can also be simulated ''without'' using a break statement as follows:
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,215: Line 1,483:
fmt.Println(value)
fmt.Println(value)
}
}
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,221: Line 1,489:
Same as before.
Same as before.
</pre>
</pre>
::<lang go>package main
::<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,247: Line 1,515:
}
}
fmt.Println(n3) // prt 8
fmt.Println(n3) // prt 8
}</lang>
}</syntaxhighlight>


=={{header|Groovy}}==
=={{header|Groovy}}==
For Groovy 3.0.0 and later.
For Groovy 3.0.0 and later.
<lang groovy>def i = 0
<syntaxhighlight lang="groovy">def i = 0
do {
do {
i++
i++
println i
println i
} while (i % 6 != 0)</lang>
} 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.
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.
<lang groovy>def i = 0
<syntaxhighlight lang="groovy">def i = 0
while (true) {
while (true) {
i++
i++
println i
println i
if (i % 6 == 0) break
if (i % 6 == 0) break
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,271: Line 1,539:
5
5
6</pre>
6</pre>

=={{header|GW-BASIC}}==
GW-BASIC does not have a <code>do .. while</code> construct.
Equivalent using <code>WHILE</code>:
{{works with|PC-BASIC|any}}
<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
</lang>
Equivalent using <code>GOTO</code>:
{{works with|PC-BASIC|any}}
<lang gwbasic>
10 LET I% = 0
20 LET I% = I% + 1
30 PRINT I%
40 IF I% MOD 6 <> 0 THEN GOTO 20
</lang>


=={{header|Harbour}}==
=={{header|Harbour}}==
<lang visualfoxpro>LOCAL n := 0
<syntaxhighlight lang="visualfoxpro">LOCAL n := 0


DO WHILE .T.
DO WHILE .T.
Line 1,303: Line 1,548:
EXIT
EXIT
ENDIF
ENDIF
ENDDO</lang>
ENDDO</syntaxhighlight>


=={{header|Haskell}}==
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">import Data.List

<lang haskell>import Data.List
import Control.Monad
import Control.Monad
import Control.Arrow
import Control.Arrow


doWhile p f n = (n:) $ takeWhile p $ unfoldr (Just.(id &&& f)) $ succ n</lang>
doWhile p f n = (n:) $ takeWhile p $ unfoldr (Just.(id &&& f)) $ succ n</syntaxhighlight>
Example executed in GHCi:
Example executed in GHCi:
<lang haskell>*Main> mapM_ print $ doWhile ((/=0).(`mod`6)) succ 0
<syntaxhighlight lang="haskell">*Main> mapM_ print $ doWhile ((/=0).(`mod`6)) succ 0
0
0
1
1
Line 1,319: Line 1,563:
3
3
4
4
5</lang>
5</syntaxhighlight>


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.
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.


<lang haskell>main :: IO ()
<syntaxhighlight lang="haskell">main :: IO ()
main =
main =
mapM_ print . reverse $
mapM_ print . reverse $
Line 1,329: Line 1,573:
(\(x:_) -> (x > 0) && (mod x 6 == 0))
(\(x:_) -> (x > 0) && (mod x 6 == 0))
(\xs@(x:_) -> succ x : xs)
(\xs@(x:_) -> succ x : xs)
[0]</lang>
[0]</syntaxhighlight>


{{Out}}
{{Out}}
Line 1,342: Line 1,586:
=== With mutable references ===
=== With mutable references ===
Using iterateWhile from monad-loops package
Using iterateWhile from monad-loops package
<lang haskell>import Data.IORef
<syntaxhighlight lang="haskell">import Data.IORef
import Control.Monad.Loops
import Control.Monad.Loops


Line 1,351: Line 1,595:
val <- readIORef x
val <- readIORef x
print val
print val
return val</lang>
return val</syntaxhighlight>


=={{header|Haxe}}==
=={{header|Haxe}}==
<lang haxe>var val = 0;
<syntaxhighlight lang="haxe">var val = 0;


do {
do {
val++;
val++;
Sys.println(val);
Sys.println(val);
} while( val % 6 != 0);</lang>
} while( val % 6 != 0);</syntaxhighlight>


=={{header|HolyC}}==
=={{header|HolyC}}==
<lang holyc>U8 i = 0;
<syntaxhighlight lang="holyc">U8 i = 0;
do {
do {
i++;
i++;
Print("%d\n", i);
Print("%d\n", i);
} while (i % 6 != 0);</lang>
} while (i % 6 != 0);</syntaxhighlight>


=={{header|Icon}} and {{header|Unicon}}==
=={{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.)
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.)
<lang Icon>procedure main()
<syntaxhighlight lang="icon">procedure main()


i := 0
i := 0
Line 1,377: Line 1,621:
if i % 6 = 0 then break
if i % 6 = 0 then break
}
}
end</lang>
end</syntaxhighlight>


=={{header|J}}==
=={{header|J}}==
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:


,. ([^:(0=6|])>:)^:a: 0
<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).
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).
<lang j>3 : 0 ] 0
<syntaxhighlight lang="j">3 : 0 ] 0


NB. The 'st' in 'whilst' stands for 'skip test'
NB. The 'st' in 'whilst' stands for 'skip test'
Line 1,395: Line 1,658:


i.0 0
i.0 0
)</lang>
)</syntaxhighlight>


Though it's rare to see J code like this.
Though it's rare to see J code like this.
Line 1,401: Line 1,664:
=={{header|Java}}==
=={{header|Java}}==


<lang java>int val = 0;
<syntaxhighlight lang="java">int val = 0;
do{
do{
val++;
val++;
System.out.println(val);
System.out.println(val);
}while(val % 6 != 0);</lang>
}while(val % 6 != 0);</syntaxhighlight>


=={{header|JavaScript}}==
=={{header|JavaScript}}==


===Javascript: Imperative===
===Javascript: Imperative===
<lang javascript>var val = 0;
<syntaxhighlight lang="javascript">var val = 0;
do {
do {
print(++val);
print(++val);
} while (val % 6);</lang>
} while (val % 6);</syntaxhighlight>


===Javascript: Functional===
===Javascript: Functional===
Line 1,423: Line 1,686:
:#and a conditional While function.
:#and a conditional While function.


<lang JavaScript>function doWhile(varValue, fnBody, fnTest) {
<syntaxhighlight lang="javascript">function doWhile(varValue, fnBody, fnTest) {
'use strict';
'use strict';
var d = fnBody(varValue); // a transformed value
var d = fnBody(varValue); // a transformed value
Line 1,441: Line 1,704:
}
}
).join('\n')
).join('\n')
);</lang>
);</syntaxhighlight>


Output:
Output:
<syntaxhighlight lang="javascript">1
<lang JavaScript>1
2
2
3
3
4
4
5
5
6</lang>
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.
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.
Line 1,455: Line 1,718:
So, for example, something like:
So, for example, something like:


<lang JavaScript>function range(m, n) {
<syntaxhighlight lang="javascript">function range(m, n) {
'use strict';
'use strict';
return Array.apply(null, Array(n - m + 1)).map(
return Array.apply(null, Array(n - m + 1)).map(
Line 1,482: Line 1,745:
}
}
).join('\n')
).join('\n')
);</lang>
);</syntaxhighlight>


Output:
Output:
<syntaxhighlight lang="javascript">1
<lang JavaScript>1
2
2
3
3
4
4
5</lang>
5</syntaxhighlight>


====ES6====
====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.
A process or value of this kind might be better expressed (in functionally composed JavaScript) with an '''unfold''' or '''until''' function, returning a list.


<lang JavaScript>(() => {
<syntaxhighlight lang="javascript">(() => {
'use strict';
'use strict';


Line 1,541: Line 1,803:
return [result1, result2];
return [result1, result2];
})();
})();
</syntaxhighlight>
</lang>


<syntaxhighlight lang="javascript">[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]</syntaxhighlight>

<lang JavaScript>[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]</lang>


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:
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">
<lang JavaScript>
// generator with the do while loop
// generator with the do while loop
function* getValue(stop) {
function* getValue(stop) {
Line 1,569: Line 1,830:
printVal(gen, gen.next());
printVal(gen, gen.next());
})();
})();
</syntaxhighlight>
</lang>


<syntaxhighlight lang="javascript">
<lang JavaScript>
1
1
2
2
Line 1,578: Line 1,839:
5
5
6
6
</syntaxhighlight>
</lang>


=={{header|jq}}==
=={{header|jq}}==
Line 1,584: Line 1,845:
In jq 1.4, the "recurse" built-in always emits the input value, and so to accomplish the task specified here,
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:
we shall define a control structure: "do_while(action; condition)" as follows:
<lang jq># Perform the action, then check the condition, etc
<syntaxhighlight lang="jq"># Perform the action, then check the condition, etc
def do_while( action; condition ):
def do_while( action; condition ):
def w: action | if (condition | not) then empty else ., w end;
def w: action | if (condition | not) then empty else ., w end;
w;</lang>
w;</syntaxhighlight>
'''The task:'''
'''The task:'''
<lang jq>0 | do_while( .+1; . % 6 != 0 )</lang>
<syntaxhighlight lang="jq">0 | do_while( .+1; . % 6 != 0 )</syntaxhighlight>
{{out}}
{{out}}
1
1
Line 1,600: Line 1,861:
Julia has no do-while construct. Here is one of several ways to implement do-while behavior.
Julia has no do-while construct. Here is one of several ways to implement do-while behavior.


<syntaxhighlight lang="julia">
<lang Julia>
julia> i = 0
julia> i = 0
0
0
Line 1,615: Line 1,876:
4
4
5
5
</syntaxhighlight>
</lang>


Using a macro that mimics the classic C style do-while.
Using a macro that mimics the classic C style do-while.
Line 1,621: Line 1,882:
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>).
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">
<lang Julia>
julia> @eval macro $(:do)(block, when::Symbol, condition)
julia> @eval macro $(:do)(block, when::Symbol, condition)
when ≠ :when && error("@do expected `when` got `$s`")
when ≠ :when && error("@do expected `when` got `$s`")
Line 1,648: Line 1,909:
i = 4
i = 4
i = 5
i = 5
</syntaxhighlight>
</lang>


Here is mostly the same macro, but with the conditional clause used first, which is arguably more readable.
Here is mostly the same macro, but with the conditional clause used first, which is arguably more readable.


<syntaxhighlight lang="julia">
<lang Julia>
julia> macro do_while(condition, block)
julia> macro do_while(condition, block)
quote
quote
Line 1,678: Line 1,939:
i = 4
i = 4
i = 5
i = 5
</syntaxhighlight>
</lang>


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


fun main(args: Array<String>) {
fun main(args: Array<String>) {
Line 1,689: Line 1,950:
}
}
while (value % 6 != 0)
while (value % 6 != 0)
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,705: Line 1,966:


=={{header|Lasso}}==
=={{header|Lasso}}==
<lang Lasso>local(x = 0)
<syntaxhighlight lang="lasso">local(x = 0)
while(#x % 6 > 0 || #x == 0) => {^
while(#x % 6 > 0 || #x == 0) => {^
++#x
++#x
'\r' // for formatting
'\r' // for formatting
^}</lang>
^}</syntaxhighlight>


=={{header|Lambdatalk}}==
=={{header|Lambdatalk}}==
<lang scheme>
<syntaxhighlight lang="scheme">
{def do_while
{def do_while
{def do_while.r
{def do_while.r
Line 1,725: Line 1,986:
{do_while 0}
{do_while 0}
-> 0 1 2 3 4 5 6 (end of loop)
-> 0 1 2 3 4 5 6 (end of loop)
</syntaxhighlight>
</lang>


=={{header|Liberty BASIC}}==
=={{header|Lang}}==
Lang does not have a do-while loop. A simple loop like the example below can be used.
<lang lb>
<syntaxhighlight lang="lang">
a = 0
$i = 0
do
loop {
a =a +1
$i += 1
print a
loop until ( a mod 6) = 0
fn.println($i)
</lang>
if(!($i % 6)) {
con.break
}
}
</syntaxhighlight>


=={{header|Lingo}}==
=={{header|Lingo}}==
Lingo has no do..while, but here how this behavior can be implemented:
Lingo has no do..while, but here how this behavior can be implemented:
<lang lingo>i = 0
<syntaxhighlight lang="lingo">i = 0
repeat while TRUE
repeat while TRUE
i = i+1
i = i+1
put i
put i
if i mod 6 = 0 then exit repeat
if i mod 6 = 0 then exit repeat
end</lang>
end</syntaxhighlight>


=={{header|Lisaac}}==
=={{header|Lisaac}}==
<lang Lisaac>+ val : INTEGER;
<syntaxhighlight lang="lisaac">+ val : INTEGER;
{
{
val := val + 1;
val := val + 1;
Line 1,752: Line 2,019:
'\n'.print;
'\n'.print;
val % 6 != 0
val % 6 != 0
}.while_do { };</lang>
}.while_do { };</syntaxhighlight>


=={{header|LiveCode}}==
=={{header|LiveCode}}==
<lang LiveCode>repeat while n mod 6 is not 0 or n is 0
<syntaxhighlight lang="livecode">repeat while n mod 6 is not 0 or n is 0
add 1 to n
add 1 to n
put n
put n
end repeat</lang>
end repeat</syntaxhighlight>


=={{header|Logo}}==
=={{header|Logo}}==
<lang logo>make "val 0
<syntaxhighlight lang="logo">make "val 0
do.while [make "val :val + 1 print :val] [notequal? 0 modulo :val 6]
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]
do.until [make "val :val + 1 print :val] [equal? 0 modulo :val 6]
Line 1,770: Line 2,037:
if notequal? 0 modulo :n 6 [my.loop :n]
if notequal? 0 modulo :n 6 [my.loop :n]
end
end
my.loop 0</lang>
my.loop 0</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==
Line 1,776: Line 2,043:
Lua doesn't have a <code>do .. while</code> construct.
Lua doesn't have a <code>do .. while</code> construct.


<lang lua>
<syntaxhighlight lang="lua">
i=0
i=0
repeat
repeat
Line 1,782: Line 2,049:
print(i)
print(i)
until i%6 == 0
until i%6 == 0
</syntaxhighlight>
</lang>


=={{header|M2000 Interpreter}}==
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module checkit {
Module checkit {
x=0
x=0
\\ Do or Repeat
\\ 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 {
Do {
x++
x++
Print x
print x,
} Until x mod 6=0
} when x mod 6>0
print
x=0
x=0
{
{
Line 1,800: Line 2,075:
if x mod 6<>0 Then loop ' set loop flag of current block to true
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
\\ when block end check Loop flag and if true execute block again
Print X
print x,
}
}
print
}
}
Checkit
Checkit
module Old_Style {
</lang>
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}}
{{out}}
<pre>
<pre>
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1
1
2
2
Line 1,823: Line 2,131:


=={{header|Maple}}==
=={{header|Maple}}==
<lang Maple>val := 0:
<syntaxhighlight lang="maple">val := 0:
do
do
val := 1 + val;
val := 1 + val;
Line 1,830: Line 2,138:
break
break
end if;
end if;
end do:</lang>
end do:</syntaxhighlight>


=={{header|Mathematica}}/{{header|Wolfram Language}}==
=={{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.
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 = 0;
<syntaxhighlight lang="mathematica">value = 0;
While[
While[
value++;
value++;
Print[value];
Print[value];
Mod[value,6]!=0
Mod[value,6]!=0
]</lang>
]</syntaxhighlight>


=={{header|MATLAB}} / {{header|Octave}}==
=={{header|MATLAB}} / {{header|Octave}}==


<lang Matlab> a=0;
<syntaxhighlight lang="matlab"> a=0;
while (1)
while (1)
a = a+1;
a = a+1;
disp(a);
disp(a);
if (~mod(a,6)) break; end;
if (~mod(a,6)) break; end;
end; </lang>
end; </syntaxhighlight>


=={{header|Maxima}}==
=={{header|Maxima}}==
<lang maxima>block([n: 0], do (ldisp(n: n + 1), if mod(n, 6) = 0 then return('done)))$</lang>
<syntaxhighlight lang="maxima">block([n: 0], do (ldisp(n: n + 1), if mod(n, 6) = 0 then return('done)))$</syntaxhighlight>


=={{header|MAXScript}}==
=={{header|MAXScript}}==
<lang maxscript>a = 0
<syntaxhighlight lang="maxscript">a = 0
do
do
(
(
Line 1,860: Line 2,168:
a += 1
a += 1
)
)
while mod a 6 != 0</lang>
while mod a 6 != 0</syntaxhighlight>


=={{header|Metafont}}==
=={{header|Metafont}}==
Line 1,866: Line 2,174:
Metafont has no a do-while construct; the same thing can be done using a forever loop and exitif.
Metafont has no a do-while construct; the same thing can be done using a forever loop and exitif.


<lang metafont>a := 0;
<syntaxhighlight lang="metafont">a := 0;
forever: show a; a := a + 1; exitif a mod 6 = 0; endfor
forever: show a; a := a + 1; exitif a mod 6 = 0; endfor
end</lang>
end</syntaxhighlight>

=={{header|Microsoft Small Basic}}==
Microsoft Small Basic does not have a <code>do .. while</code> construct.
Equivalent using <code>While</code>:
<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
</lang>
Equivalent using <code>Goto</code>:
<lang microsoftsmallbasic>
i = 0
loopStart:
i = i + 1
TextWindow.WriteLine(i)
If Math.Remainder(i, 6) <> 0 Then
Goto loopStart
EndIf
</lang>


=={{header|min}}==
=={{header|min}}==
{{works with|min|0.19.6}}
{{works with|min|0.19.6}}
<lang min>0 (dup 6 mod 0 == over 0 != and) 'pop (puts succ) () linrec</lang>
<syntaxhighlight lang="min">0 (dup 6 mod 0 == over 0 != and) 'pop (puts succ) () linrec</syntaxhighlight>


=={{header|MIPS Assembly}}==
=={{header|MIPS Assembly}}==
<syntaxhighlight lang="mips">

<lang mips>
.text
.text
main: li $s0, 0 # start at 0.
main: li $s0, 0 # start at 0.
Line 1,914: Line 2,197:
li $v0, 10
li $v0, 10
syscall # syscall to end the program
syscall # syscall to end the program
</syntaxhighlight>
</lang>


=={{header|МК-61/52}}==
=={{header|МК-61/52}}==
<lang>0 П4 КИП4 ИП4 6 / {x} x=0 02 С/П</lang>
<syntaxhighlight lang="text">0 П4 КИП4 ИП4 6 / {x} x=0 02 С/П</syntaxhighlight>


=={{header|Modula-2}}==
=={{header|Modula-2}}==
<lang modula2>MODULE DoWhile;
<syntaxhighlight lang="modula2">MODULE DoWhile;
IMPORT InOut;
IMPORT InOut;


Line 1,927: Line 2,210:


BEGIN
BEGIN
i := 0
i := 0;
REPEAT
REPEAT
INC(i);
InOut.WriteInt(i, 1);
InOut.WriteInt(i, 1);
InOut.WriteLn;
InOut.WriteLn;
INC(i)
UNTIL i MOD 6 = 0;
UNTIL i MOD 6 = 0;
END DoWhile.</lang>
END DoWhile.</syntaxhighlight>


=={{header|Modula-3}}==
=={{header|Modula-3}}==
This is very similar to the [[Modula-2]] code above.
This is very similar to the [[Modula-2]] code above.
<lang modula3>REPEAT
<syntaxhighlight lang="modula3">REPEAT
i := i + 1;
i := i + 1;
IO.Put(Fmt.Int(i));
IO.Put(Fmt.Int(i));
UNTIL i MOD 6 = 0;</lang>
UNTIL i MOD 6 = 0;</syntaxhighlight>


=={{header|Monicelli}}==
=={{header|Monicelli}}==
The do-while loop is the only kind of loop available in Monicelli
The do-while loop is the only kind of loop available in Monicelli
<lang monicelli>
<syntaxhighlight lang="monicelli">
stuzzica
stuzzica
... # loop body
... # loop body
e brematura anche, se <expr> # exit if <expr> is false
e brematura anche, se <expr> # exit if <expr> is false
</syntaxhighlight>
</lang>


=={{header|MUMPS}}==
=={{header|MUMPS}}==
{{works with|Caché ObjectScript}}
{{works with|Caché ObjectScript}}
<lang MUMPS>DOWHILELOOP
<syntaxhighlight lang="mumps">DOWHILELOOP
set val = 0
set val = 0
do {
do {
Line 1,959: Line 2,242:
} while ((val # 6) '= 0)
} while ((val # 6) '= 0)
quit</lang>
quit</syntaxhighlight>
{{out}}<pre>
{{out}}<pre>
Line 1,972: Line 2,255:


=={{header|Neko}}==
=={{header|Neko}}==
<syntaxhighlight lang="actionscript">/**
<lang ActionScript>/**
Loops/Do-while in Neko
Loops/Do-while in Neko
Tectonics:
Tectonics:
Line 1,983: Line 2,266:
index += 1;
index += 1;
$print(index, "\n");
$print(index, "\n");
} while (index % 6) != 0</lang>
} while (index % 6) != 0</syntaxhighlight>


{{out}}
{{out}}
Line 1,996: Line 2,279:


=={{header|Nemerle}}==
=={{header|Nemerle}}==
<lang Nemerle>mutable x = 0;
<syntaxhighlight lang="nemerle">mutable x = 0;
do
do
{
{
x++;
x++;
WriteLine($"$x");
WriteLine($"$x");
} while (x % 6 != 0)</lang>
} while (x % 6 != 0)</syntaxhighlight>


=={{header|NetRexx}}==
=={{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.
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.
<lang NetRexx>/* NetRexx */
<syntaxhighlight lang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
options replace format comments java crossref savelog symbols nobinary


Line 2,016: Line 2,299:
say i_
say i_
end
end
</syntaxhighlight>
</lang>


=={{header|NewLISP}}==
=={{header|NewLISP}}==
<lang NewLISP>(let ((i 0))
<syntaxhighlight lang="newlisp">(let ((i 0))
(do-until (= 0 (% i 6))
(do-until (= 0 (% i 6))
(println (++ i))))</lang>
(println (++ i))))</syntaxhighlight>


=={{header|Nim}}==
=={{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:
Nim does not have a do-while loop. The standard way to simulate it consists in an infinite loop with a break statement:


<lang Nim>var val = 0
<syntaxhighlight lang="nim">var val = 0
while true:
while true:
inc val
inc val
echo val
echo val
if val mod 6 == 0: break</lang>
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):
It's also easy to write your own doWhile construction (but be aware that the instructions will be duplicated):
<lang Nim>template doWhile(a, b: untyped): untyped =
<syntaxhighlight lang="nim">template doWhile(a, b: untyped): untyped =
b
b
while a:
while a:
Line 2,041: Line 2,324:
doWhile val mod 6 != 0:
doWhile val mod 6 != 0:
inc val
inc val
echo val</lang>
echo val</syntaxhighlight>


=={{header|NS-HUBASIC}}==
=={{header|Nu}}==
<syntaxhighlight lang="nu">
<lang NS-HUBASIC>10 PRINT "NO,"A" ISN'T A MULTIPLE OF 6."
mut n = 0
20 A=A+1
while true {
30 IF A-(A/6)*6<>0 THEN GOTO 10
$n += 1
40 PRINT "YES, 6 IS A MULTIPLE OF 6."</lang>
print $n
if $n mod 6 == 0 {break}
}
</syntaxhighlight>


=={{header|Oberon-2}}==
=={{header|Oberon-2}}==
Works with oo2c Version 2
Works with oo2c Version 2
<lang oberon2>
<syntaxhighlight lang="oberon2">
MODULE LoopDoWhile;
MODULE LoopDoWhile;
IMPORT
IMPORT
Line 2,070: Line 2,357:
Do
Do
END LoopDoWhile.
END LoopDoWhile.
</syntaxhighlight>
</lang>


=={{header|Objeck}}==
=={{header|Objeck}}==
<lang objeck>
<syntaxhighlight lang="objeck">
i := 0;
i := 0;
do {
do {
Line 2,080: Line 2,367:
}
}
while (i % 6 <> 0);
while (i % 6 <> 0);
</syntaxhighlight>
</lang>


=={{header|OCaml}}==
=={{header|OCaml}}==
OCaml doesn't have a do-while loop, so we can just make a local loop:
OCaml doesn't have a do-while loop, so we can just make a local loop:
<lang ocaml>let rec loop i =
<syntaxhighlight lang="ocaml">let rec loop i =
let i = succ i in
let i = succ i in
Printf.printf "%d\n" i;
Printf.printf "%d\n" i;
Line 2,090: Line 2,377:
loop i
loop i
in
in
loop 0</lang>
loop 0</syntaxhighlight>


or implementing a generic do-while iterator with higher order function:
or implementing a generic do-while iterator with higher order function:


<lang ocaml>let do_while f p =
<syntaxhighlight lang="ocaml">let do_while f p =
let rec loop() =
let rec loop() =
f();
f();
Line 2,100: Line 2,387:
in
in
loop()
loop()
(** val do_while : (unit -> 'a) -> (unit -> bool) -> unit *)</lang>
(** val do_while : (unit -> 'a) -> (unit -> bool) -> unit *)</syntaxhighlight>


<lang ocaml>let v = ref 0 in
<syntaxhighlight lang="ocaml">let v = ref 0 in
do_while (fun () -> incr v; Printf.printf "%d\n" !v)
do_while (fun () -> incr v; Printf.printf "%d\n" !v)
(fun () -> !v mod 6 <> 0)</lang>
(fun () -> !v mod 6 <> 0)</syntaxhighlight>


The example above is the an imperative form, below is its functional counterpart:
The example above is the an imperative form, below is its functional counterpart:
<lang ocaml>let do_while f p ~init =
<syntaxhighlight lang="ocaml">let do_while f p ~init =
let rec loop v =
let rec loop v =
let v = f v in
let v = f v in
Line 2,119: Line 2,406:
(v))
(v))
(fun v -> v mod 6 <> 0)
(fun v -> v mod 6 <> 0)
~init:0</lang>
~init:0</syntaxhighlight>


Or in a very poor OCaml style, we can use an exception to exit a while loop:
Or in a very poor OCaml style, we can use an exception to exit a while loop:
<lang ocaml>let v = ref 0
<syntaxhighlight lang="ocaml">let v = ref 0
exception Exit_loop
exception Exit_loop
try while true do
try while true do
Line 2,130: Line 2,417:
raise Exit_loop;
raise Exit_loop;
done
done
with Exit_loop -> ()</lang>
with Exit_loop -> ()</syntaxhighlight>


=={{header|Octave}}==
=={{header|Octave}}==
The do-while can be changed into a do-until, just negating the condition of the while.
The do-while can be changed into a do-until, just negating the condition of the while.
<lang octave>val = 0;
<syntaxhighlight lang="octave">val = 0;
do
do
val++;
val++;
disp(val)
disp(val)
until( mod(val, 6) == 0 )</lang>
until( mod(val, 6) == 0 )</syntaxhighlight>


=={{header|Oforth}}==
=={{header|Oforth}}==


<lang Oforth>0 doWhile: [ 1+ dup . dup 6 rem 0 <> ] drop</lang>
<syntaxhighlight lang="oforth">0 doWhile: [ 1+ dup . dup 6 rem 0 <> ] drop</syntaxhighlight>


=={{header|OpenEdge/Progress}}==
=={{header|OpenEdge/Progress}}==
<lang progress>DEFINE VARIABLE ii AS INTEGER.
<syntaxhighlight lang="progress">DEFINE VARIABLE ii AS INTEGER.


DO WHILE ii MODULO 6 <> 0 OR ii = 0:
DO WHILE ii MODULO 6 <> 0 OR ii = 0:
ii = ii + 1.
ii = ii + 1.
MESSAGE ii VIEW-AS ALERT-BOX.
MESSAGE ii VIEW-AS ALERT-BOX.
END.</lang>
END.</syntaxhighlight>


=={{header|Oz}}==
=={{header|Oz}}==
Normal Oz variables are single-assignment only. So we use a "cell", which is a one-element mutable container.
Normal Oz variables are single-assignment only. So we use a "cell", which is a one-element mutable container.
<lang oz>declare
<syntaxhighlight lang="oz">declare
I = {NewCell 0}
I = {NewCell 0}
in
in
Line 2,160: Line 2,447:
I := @I + 1
I := @I + 1
{Show @I}
{Show @I}
end</lang>
end</syntaxhighlight>


=={{header|PARI/GP}}==
=={{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.
The generic Pari loops (<code>while</code>, <code>until</code>) test at the beginning, so just use an infinite loop with a break.
<lang parigp>x = 0;
<syntaxhighlight lang="parigp">x = 0;
while(1,
while(1,
print(x++);
print(x++);
if(x % 6 == 0, break)
if(x % 6 == 0, break)
)</lang>
)</syntaxhighlight>


If the loop body is something simple then it might be worked into the loop condition. This is obscure but compact.
If the loop body is something simple then it might be worked into the loop condition. This is obscure but compact.


<lang parigp>x = 0;
<syntaxhighlight lang="parigp">x = 0;
while (print(x++) || x % 6, )</lang>
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.
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}}==
=={{header|Pascal}}==
<lang pascal>program countto6(output);
<syntaxhighlight lang="pascal">program countto6(output);


var
var
Line 2,189: Line 2,476:
writeln(i)
writeln(i)
until i mod 6 = 0
until i mod 6 = 0
end.</lang>
end.</syntaxhighlight>


=={{header|Perl}}==
=={{header|Perl}}==
<lang perl>my $val = 0;
<syntaxhighlight lang="perl">my $val = 0;
do {
do {
$val++;
$val++;
print "$val\n";
print "$val\n";
} while ($val % 6);</lang>
} while ($val % 6);</syntaxhighlight>
<code>do ... until (''condition'')</code> is equivalent to <code>do ... while (not ''condition'')</code>.
<code>do ... until (''condition'')</code> is equivalent to <code>do ... while (not ''condition'')</code>.
<lang perl>my $val = 0;
<syntaxhighlight lang="perl">my $val = 0;
do {
do {
$val++;
$val++;
print "$val\n";
print "$val\n";
} until ($val % 6 == 0);</lang>
} until ($val % 6 == 0);</syntaxhighlight>


=={{header|Phix}}==
=={{header|Phix}}==
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<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: #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: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
Line 2,212: Line 2,499:
<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;">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>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</lang>-->
<!--</syntaxhighlight>-->

=={{header|Phixmonti}}==
<syntaxhighlight lang="Phixmonti">/# Rosetta Code problem: https://rosettacode.org/wiki/Loops/Do-while
by Galileo, 11/2022 #/

include ..\Utilitys.pmt

0
true while
1 +
dup ?
dup 6 mod
endwhile</syntaxhighlight>


=={{header|PHL}}==
=={{header|PHL}}==


<lang phl>var i = 0;
<syntaxhighlight lang="phl">var i = 0;
do {
do {
i = i::inc;
i = i::inc;
printf("%i\n", i);
printf("%i\n", i);
} while (i%6 != 0);</lang>
} while (i%6 != 0);</syntaxhighlight>


=={{header|PHP}}==
=={{header|PHP}}==
<lang php>$val = 0;
<syntaxhighlight lang="php">$val = 0;
do {
do {
$val++;
$val++;
print "$val\n";
print "$val\n";
} while ($val % 6 != 0);</lang>
} while ($val % 6 != 0);</syntaxhighlight>

=={{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}}==
=={{header|PicoLisp}}==
Literally:
Literally:
<lang PicoLisp>(let Val 0
<syntaxhighlight lang="picolisp">(let Val 0
(loop
(loop
(println (inc 'Val))
(println (inc 'Val))
(T (=0 (% Val 6))) ) )</lang>
(T (=0 (% Val 6))) ) )</syntaxhighlight>
Shorter:
Shorter:
<lang PicoLisp>(let Val 0
<syntaxhighlight lang="picolisp">(let Val 0
(until (=0 (% (println (inc 'Val)) 6))) )</lang>
(until (=0 (% (println (inc 'Val)) 6))) )</syntaxhighlight>
or:
or:
<lang PicoLisp>(for (Val 0 (n0 (% (println (inc 'Val)) 6))))</lang>
<syntaxhighlight lang="picolisp">(for (Val 0 (n0 (% (println (inc 'Val)) 6))))</syntaxhighlight>


=={{header|Pike}}==
=={{header|Pike}}==
<lang pike>int main(){
<syntaxhighlight lang="pike">int main(){
int value = 0;
int value = 0;
do {
do {
Line 2,248: Line 2,577:
write(value + "\n");
write(value + "\n");
} while (value % 6);
} while (value % 6);
}</lang>
}</syntaxhighlight>

=={{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}}==
=={{header|PL/I}}==
<lang pli>
<syntaxhighlight lang="pli">
dcl value fixed bin (31) init (0);
dcl value fixed bin (31) init (0);
do forever;
do forever;
Line 2,261: Line 2,615:
put list (value);
put list (value);
end;
end;
</syntaxhighlight>
</lang>
or shorter:
or shorter:
<lang pli>
<syntaxhighlight lang="pli">
dcl value fixed bin(31) init(0);
dcl value fixed bin(31) init(0);
do Until(value=6);
do Until(value=6);
value+=1;
value+=1;
put Skip list(value);
put Skip list(value);
end;</lang>
end;</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,281: Line 2,635:
=={{header|Plain English}}==
=={{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.
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.
<lang plainenglish>To run:
<syntaxhighlight lang="plainenglish">To run:
Start up.
Start up.
Demonstrate do-while.
Demonstrate do-while.
Line 2,292: Line 2,646:
Write the string on the console.
Write the string on the console.
If the counter is evenly divisible by 6, exit.
If the counter is evenly divisible by 6, exit.
Repeat.</lang>
Repeat.</syntaxhighlight>


=={{header|Pop11}}==
=={{header|Pop11}}==
<lang pop11>lvars val = 0;
<syntaxhighlight lang="pop11">lvars val = 0;
while true do
while true do
val + 1 -> val;
val + 1 -> val;
printf(val, '%p\n');
printf(val, '%p\n');
quitif(val rem 6 = 0);
quitif(val rem 6 = 0);
endwhile;</lang>
endwhile;</syntaxhighlight>


=={{header|PowerShell}}==
=={{header|PowerShell}}==
<lang powershell>$n = 0
<syntaxhighlight lang="powershell">$n = 0
do {
do {
$n++
$n++
$n
$n
} while ($n % 6 -ne 0)</lang>
} while ($n % 6 -ne 0)</syntaxhighlight>


=={{header|Prolog}}==
=={{header|Prolog}}==
<lang prolog>
<syntaxhighlight lang="prolog">
% initial condition
% initial condition
do(0):- write(0),nl,do(1).
do(0):- write(0),nl,do(1).
Line 2,326: Line 2,680:
do(0).
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}}==
=={{header|Python}}==
Python doesn't have a do-while loop.
Python doesn't have a do-while loop.
<lang python>val = 0
<syntaxhighlight lang="python">val = 0
while True:
while True:
val +=1
val +=1
print val
print val
if val % 6 == 0: break</lang>
if val % 6 == 0: break</syntaxhighlight>
or repeat the body of the loop before a standard while.
or repeat the body of the loop before a standard while.
<lang python>val = 1
<syntaxhighlight lang="python">val = 1
print val
print val
while val % 6 != 0:
while val % 6 != 0:
val += 1
val += 1
print val</lang>
print val</syntaxhighlight>

=={{header|QB64}}==
''CBTJD'': 2020/03/14
<lang qbasic>DO
PRINT n
n = n + 1
LOOP WHILE n MOD 6 <> 0</lang>


=={{header|Quackery}}==
=={{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>.
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>.
<lang quackery>0 [ 1+ dup echo cr
<syntaxhighlight lang="quackery">0 [ 1+ dup echo cr
dup 6 mod 0 = until ] drop</lang>
dup 6 mod 0 = until ] drop</syntaxhighlight>


=={{header|R}}==
=={{header|R}}==
<lang R>i <- 0
<syntaxhighlight lang="r">i <- 0
repeat
repeat
{
{
Line 2,369: Line 2,708:
print(i)
print(i)
if(i %% 6 == 0) break
if(i %% 6 == 0) break
}</lang>
}</syntaxhighlight>


=={{header|Racket}}==
=={{header|Racket}}==

Idiomatic Racket code is functional:
Idiomatic Racket code is functional:
<lang racket>
<syntaxhighlight lang="racket">
#lang racket
#lang racket
(let loop ([n 0])
(let loop ([n 0])
Line 2,380: Line 2,718:
(displayln n)
(displayln n)
(unless (zero? (modulo n 6)) (loop n))))
(unless (zero? (modulo n 6)) (loop n))))
</syntaxhighlight>
</lang>


But an imperative version is easy to do too:
But an imperative version is easy to do too:
<lang racket>
<syntaxhighlight lang="racket">
#lang racket
#lang racket
(define n 0)
(define n 0)
Line 2,390: Line 2,728:
(displayln n)
(displayln n)
(unless (zero? (modulo n 6)) (loop)))
(unless (zero? (modulo n 6)) (loop)))
</syntaxhighlight>
</lang>


=={{header|Raku}}==
=={{header|Raku}}==
Line 2,396: Line 2,734:
{{works with|Rakudo Star|2010.08}}
{{works with|Rakudo Star|2010.08}}


<lang perl6>my $val = 0;
<syntaxhighlight lang="raku" line>my $val = 0;
repeat {
repeat {
say ++$val;
say ++$val;
} while $val % 6;</lang>
} while $val % 6;</syntaxhighlight>


<code>repeat ... until ''condition''</code> is equivalent to <code>do ... while not ''condition''</code>.
<code>repeat ... until ''condition''</code> is equivalent to <code>do ... while not ''condition''</code>.


<lang perl6>my $val = 0;
<syntaxhighlight lang="raku" line>my $val = 0;
repeat {
repeat {
say ++$val;
say ++$val;
} until $val %% 6;</lang>
} until $val %% 6;</syntaxhighlight>
(Here we've used <code>%%</code>, the "divisible-by" operator.)
(Here we've used <code>%%</code>, the "divisible-by" operator.)
<p>
<p>
You can also put the condition before the block, without changing the order of evaluation.
You can also put the condition before the block, without changing the order of evaluation.


<lang perl6>my $val = 0;
<syntaxhighlight lang="raku" line>my $val = 0;
repeat while $val % 6 {
repeat while $val % 6 {
say ++$val;
say ++$val;
}</lang>
}</syntaxhighlight>


=={{header|REBOL}}==
=={{header|REBOL}}==
<lang REBOL>REBOL [
<syntaxhighlight lang="rebol">REBOL [
Title: "Loop/While"
Title: "Loop/While"
URL: http://rosettacode.org/wiki/Loop/Do_While
URL: http://rosettacode.org/wiki/Loop/Do_While
Line 2,431: Line 2,769:


0 = mod value 6
0 = mod value 6
]</lang>
]</syntaxhighlight>


{{out}}
{{out}}
Line 2,442: Line 2,780:


=={{header|Red}}==
=={{header|Red}}==
<lang Red>Red []
<syntaxhighlight lang="red">Red []
i: 0
i: 0
until [
until [
Line 2,449: Line 2,787:
i % 6 = 0 ;; loop , until this is true...
i % 6 = 0 ;; loop , until this is true...
]
]
</lang>{{out}}
</syntaxhighlight>{{out}}
<pre>i: 0
<pre>i: 0
i: 1
i: 1
Line 2,467: Line 2,805:
<br>This necessitates the use of '''DO UNTIL''' instead of '''DO WHILE'''.
<br>This necessitates the use of '''DO UNTIL''' instead of '''DO WHILE'''.
===version 1===
===version 1===
<lang rexx>/*REXX program demonstrates a DO UNTIL construction. */
<syntaxhighlight lang="rexx">/*REXX program demonstrates a DO UNTIL construction. */
v=0
v=0
do until v//6==0 /*REXX // is the ÷ remainder.*/
do until v//6==0 /*REXX // is the ÷ remainder.*/
Line 2,473: Line 2,811:
say v
say v
end
end
/*stick a fork in it, we're done.*/</lang>
/*stick a fork in it, we're done.*/</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,485: Line 2,823:


===version 2===
===version 2===
<lang rexx>/*REXX program demonstrates a DO UNTIL construction. */
<syntaxhighlight lang="rexx">/*REXX program demonstrates a DO UNTIL construction. */


do v=1 until v//6==0 /*REXX // is the ÷ remainder.*/
do v=1 until v//6==0 /*REXX // is the ÷ remainder.*/
say v
say v
end
end
/*stick a fork in it, we're done.*/</lang>
/*stick a fork in it, we're done.*/</syntaxhighlight>
'''output''' is the same as the 1<sup>st</sup> version.<br>
'''output''' is the same as the 1<sup>st</sup> version.<br>


=={{header|Ring}}==
=={{header|Ring}}==
<lang ring>
<syntaxhighlight lang="ring">
n = 0
n = 0
While True
While True
Line 2,500: Line 2,838:
if n % 6 = 0 exit ok
if n % 6 = 0 exit ok
end
end
</syntaxhighlight>
</lang>

=={{header|RPL}}==
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>
≪ 0
'''DO'''
1 + DUP
'''UNTIL''' DUP 6 MOD 0 == '''END'''
DROP


=={{header|Ruby}}==
=={{header|Ruby}}==
Line 2,509: Line 2,856:
! until
! until
|-
|-
| <lang ruby>val = 0
| <syntaxhighlight lang="ruby">val = 0
begin
begin
val += 1
val += 1
puts val
puts val
end while val % 6 != 0</lang>
end while val % 6 != 0</syntaxhighlight>
| <lang ruby>val = 0
| <syntaxhighlight lang="ruby">val = 0
begin
begin
val += 1
val += 1
puts val
puts val
end until val % 6 == 0</lang>
end until val % 6 == 0</syntaxhighlight>
|}
|}


During November 2005, Yukihiro Matsumoto, the creator of Ruby, [http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6741 regretted this loop feature] and [http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745 suggested using Kernel#loop].
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"
{| class="wikitable"
Line 2,527: Line 2,874:
! break if
! break if
|-
|-
| <lang ruby>val = 0
| <syntaxhighlight lang="ruby">val = 0
loop do
loop do
val += 1
val += 1
puts val
puts val
break unless val %6 != 0
break unless val %6 != 0
end</lang>
end</syntaxhighlight>
| <lang ruby>val = 0
| <syntaxhighlight lang="ruby">val = 0
loop do
loop do
val += 1
val += 1
puts val
puts val
break if val %6 == 0
break if val %6 == 0
end</lang>
end</syntaxhighlight>
|}
|}


Line 2,547: Line 2,894:
Rust does not have a <tt>do...while</tt> loop. Instead, the keyword <tt>loop</tt> is used with a termination condition.
Rust does not have a <tt>do...while</tt> loop. Instead, the keyword <tt>loop</tt> is used with a termination condition.


<lang rust>let mut x = 0;
<syntaxhighlight lang="rust">let mut x = 0;


loop {
loop {
Line 2,554: Line 2,901:


if x % 6 == 0 { break; }
if x % 6 == 0 { break; }
}</lang>
}</syntaxhighlight>


=={{header|Salmon}}==
=={{header|Salmon}}==
<lang Salmon>variable x := 0;
<syntaxhighlight lang="salmon">variable x := 0;
do
do
{
{
Line 2,563: Line 2,910:
x!
x!
}
}
while (x % 6 != 0);</lang>
while (x % 6 != 0);</syntaxhighlight>


=={{header|SAS}}==
=={{header|SAS}}==
<lang sas>/* using DO UNTIL so that the loop executes at least once */
<syntaxhighlight lang="sas">/* using DO UNTIL so that the loop executes at least once */
data _null_;
data _null_;
n=0;
n=0;
Line 2,573: Line 2,920:
put n;
put n;
end;
end;
run;</lang>
run;</syntaxhighlight>


=={{header|Sather}}==
=={{header|Sather}}==
{{trans|C}}
{{trans|C}}
<lang sather>class MAIN is
<syntaxhighlight lang="sather">class MAIN is
main is
main is
val ::= 0;
val ::= 0;
Line 2,586: Line 2,933:
end;
end;
end;
end;
end;</lang>
end;</syntaxhighlight>


=={{header|Scala}}==
=={{header|Scala}}==
Line 2,592: Line 2,939:


===Imperative===
===Imperative===
<lang scala> {
<syntaxhighlight lang="scala"> {
var (x, l) = (0, List[Int]())
var (x, l) = (0, List[Int]())
do {
do {
Line 2,600: Line 2,947:
l
l
}.foreach(println(_))
}.foreach(println(_))
</syntaxhighlight>
</lang>


===Tail recursive===
===Tail recursive===
<lang scala> def loop(iter: Int, cond: (Int) => Boolean, accu: List[Int]): List[Int] = {
<syntaxhighlight lang="scala"> def loop(iter: Int, cond: (Int) => Boolean, accu: List[Int]): List[Int] = {
val succ = iter + 1
val succ = iter + 1
val temp = accu :+ succ
val temp = accu :+ succ
if (cond(succ)) loop(succ, cond, temp) else temp
if (cond(succ)) loop(succ, cond, temp) else temp
}
}
println(loop(0, (_ % 6 != 0), Nil))</lang>
println(loop(0, (_ % 6 != 0), Nil))</syntaxhighlight>


===Stream===
===Stream===
<lang scala> def loop(i: Int, cond: (Int) => Boolean): Stream[Int] = {
<syntaxhighlight lang="scala"> def loop(i: Int, cond: (Int) => Boolean): Stream[Int] = {
val succ = i + 1;
val succ = i + 1;
succ #:: (if (cond(succ)) loop(succ, cond) else Stream.empty)
succ #:: (if (cond(succ)) loop(succ, cond) else Stream.empty)
}
}
loop(0, (_ % 6 != 0)).foreach(println(_))</lang>
loop(0, (_ % 6 != 0)).foreach(println(_))</syntaxhighlight>


=={{header|Scheme}}==
=={{header|Scheme}}==
<lang scheme>(let loop ((i 1))
<syntaxhighlight lang="scheme">(let loop ((i 1))
(display i)
(display i)
(if (positive? (modulo i 6))
(if (positive? (modulo i 6))
(loop (+ i 1))))</lang>
(loop (+ i 1))))</syntaxhighlight>


=={{header|Scilab}}==
=={{header|Scilab}}==
{{works with|Scilab|5.5.1}}
{{works with|Scilab|5.5.1}}
<lang>v=0
<syntaxhighlight lang="text">v=0
while %T
while %T
v=v+1
v=v+1
Line 2,631: Line 2,978:
if modulo(v,6)==0 then break; end
if modulo(v,6)==0 then break; end
end
end
printf("\n")</lang>
printf("\n")</syntaxhighlight>
{{out}}
{{out}}
<pre> 1 2 3 4 5 6 </pre>
<pre> 1 2 3 4 5 6 </pre>


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


const proc: main is func
const proc: main is func
Line 2,646: Line 2,993:
writeln(number)
writeln(number)
until number rem 6 = 0
until number rem 6 = 0
end func;</lang>
end func;</syntaxhighlight>


=={{header|Sidef}}==
=={{header|Sidef}}==
<lang ruby>var value = 0;
<syntaxhighlight lang="ruby">var value = 0;
do {
do {
say ++value;
say ++value;
} while (value % 6);</lang>
} while (value % 6);</syntaxhighlight>


=={{header|Slate}}==
=={{header|Slate}}==
<lang slate>[| val |
<syntaxhighlight lang="slate">[| val |
val: 0.
val: 0.
[val: val + 1.
[val: val + 1.
print: val.
print: val.
val \\ 6 ~= 0] whileTrue
val \\ 6 ~= 0] whileTrue
] do.</lang>
] do.</syntaxhighlight>


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==


<lang smalltalk>|val|
<syntaxhighlight lang="smalltalk">|val|
val := 0.
val := 0.
[
[
val := val + 1.
val := val + 1.
val displayNl.
val displayNl.
] doWhile: [ (val rem: 6) ~= 0 ]</lang>
] doWhile: [ (val rem: 6) ~= 0 ]</syntaxhighlight>


<lang smalltalk>|val|
<syntaxhighlight lang="smalltalk">|val|
val := 0.
val := 0.
[
[
val := val + 1.
val := val + 1.
val displayNl.
val displayNl.
] doUntil: [ (val rem: 6) == 0 ]</lang>
] doUntil: [ (val rem: 6) == 0 ]</syntaxhighlight>


To simulate the do-while construct, we can use the
To simulate the do-while construct, we can use the
<tt>whileTrue:</tt> method of a block with a void while block.
<tt>whileTrue:</tt> method of a block with a void while block.
<lang smalltalk>|val|
<syntaxhighlight lang="smalltalk">|val|
val := 0.
val := 0.
[
[
Line 2,686: Line 3,033:
val displayNl.
val displayNl.
(val rem: 6) ~= 0
(val rem: 6) ~= 0
] whileTrue: [ ]</lang>
] whileTrue: [ ]</syntaxhighlight>


Or send the loop block a <tt>whileTrue</tt> message (without argument).
Or send the loop block a <tt>whileTrue</tt> message (without argument).
<lang smalltalk>|val|
<syntaxhighlight lang="smalltalk">|val|
val := 0.
val := 0.
[
[
Line 2,695: Line 3,042:
val displayNl.
val displayNl.
(val rem: 6) ~= 0
(val rem: 6) ~= 0
] whileTrue</lang>
] whileTrue</syntaxhighlight>


Corresponding false-checking messages are <tt>whileFalse:</tt> and <tt>whileFalse</tt> (without argument)
Corresponding false-checking messages are <tt>whileFalse:</tt> and <tt>whileFalse</tt> (without argument)


=={{header|Sparkling}}==
=={{header|Sparkling}}==
<lang sparkling>var i = 0;
<syntaxhighlight lang="sparkling">var i = 0;
do {
do {
print(++i);
print(++i);
} while (i % 6 != 0);</lang>
} while (i % 6 != 0);</syntaxhighlight>


=={{header|Spin}}==
=={{header|Spin}}==
Line 2,710: Line 3,057:
{{works with|HomeSpun}}
{{works with|HomeSpun}}
{{works with|OpenSpin}}
{{works with|OpenSpin}}
<lang spin>con
<syntaxhighlight lang="spin">con
_clkmode = xtal1 + pll16x
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
_clkfreq = 80_000_000
Line 2,729: Line 3,076:
waitcnt(_clkfreq + cnt)
waitcnt(_clkfreq + cnt)
ser.stop
ser.stop
cogstop(0)</lang>
cogstop(0)</syntaxhighlight>
{{out}}
{{out}}
<pre>1 2 3 4 5 6 </pre>
<pre>1 2 3 4 5 6 </pre>


=={{header|SPL}}==
=={{header|SPL}}==
<lang spl>n = 0
<syntaxhighlight lang="spl">n = 0
>
>
n += 1
n += 1
#.output(n)
#.output(n)
< n%6</lang>
< n%6</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,754: Line 3,101:
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.
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.


<lang stata>local n 0
<syntaxhighlight lang="stata">local n 0
local q 1
local q 1
while `q' | mod(`n',6) {
while `q' | mod(`n',6) {
local q 0
local q 0
di `++n'
di `++n'
}</lang>
}</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.
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.


<lang stata>local n 0
<syntaxhighlight lang="stata">local n 0
while 1 {
while 1 {
di `++n'
di `++n'
if mod(`n',6)==0 continue, break
if mod(`n',6)==0 continue, break
}</lang>
}</syntaxhighlight>


=== Mata ===
=== Mata ===
Mata has a '''[https://www.stata.com/help.cgi?m2_do do/while]''' loop:
Mata has a '''[https://www.stata.com/help.cgi?m2_do do/while]''' loop:


<lang>mata
<syntaxhighlight lang="text">mata
n=0
n=0
do {
do {
printf("%f\n",++n)
printf("%f\n",++n)
} while (mod(n,6))
} while (mod(n,6))
end</lang>
end</syntaxhighlight>


=={{header|Suneido}}==
=={{header|Suneido}}==
<lang Suneido>val = 0
<syntaxhighlight lang="suneido">val = 0
do
do
{
{
Print(++val)
Print(++val)
} while (val % 6 isnt 0)</lang>
} while (val % 6 isnt 0)</syntaxhighlight>


{{out}}
{{out}}
Line 2,796: Line 3,143:
=={{header|Swift}}==
=={{header|Swift}}==
{{works with|Swift|3.x+}}
{{works with|Swift|3.x+}}
<lang swift>var val = 0
<syntaxhighlight lang="swift">var val = 0
repeat {
repeat {
val += 1
val += 1
print(val)
print(val)
} while val % 6 != 0</lang>
} while val % 6 != 0</syntaxhighlight>
{{works with|Swift|2.x}}
{{works with|Swift|2.x}}
<lang swift>var val = 0
<syntaxhighlight lang="swift">var val = 0
repeat {
repeat {
val++
val++
print(val)
print(val)
} while val % 6 != 0</lang>
} while val % 6 != 0</syntaxhighlight>
{{works with|Swift|1.x}}
{{works with|Swift|1.x}}
<lang swift>var val = 0
<syntaxhighlight lang="swift">var val = 0
do {
do {
val++
val++
println(val)
println(val)
} while val % 6 != 0</lang>
} while val % 6 != 0</syntaxhighlight>


=={{header|Tailspin}}==
=={{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.
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.
<lang tailspin>
<syntaxhighlight lang="tailspin">
templates doWhile
templates doWhile
0 -> #
0 -> #
Line 2,823: Line 3,170:
$val -> \(<?($ mod 6 <~=0>)> $!\) -> #
$val -> \(<?($ mod 6 <~=0>)> $!\) -> #
end doWhile
end doWhile
</syntaxhighlight>
</lang>


=={{header|Tcl}}==
=={{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]
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]
<lang tcl>proc do {body keyword expression} {
<syntaxhighlight lang="tcl">proc do {body keyword expression} {
if {$keyword eq "while"} {
if {$keyword eq "while"} {
set expression "!($expression)"
set expression "!($expression)"
Line 2,844: Line 3,191:


set i 0
set i 0
do {puts [incr i]} while {$i % 6 != 0}</lang>
do {puts [incr i]} while {$i % 6 != 0}</syntaxhighlight>
{{tcllib|control}}
{{tcllib|control}}
<lang tcl>package require control
<syntaxhighlight 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]} while {$i % 6 != 0}
set i 0; control::do {puts [incr i]} until {$i % 6 == 0}</lang>
set i 0; control::do {puts [incr i]} until {$i % 6 == 0}</syntaxhighlight>


Mind you, it is also normal to write this task using a normal <code>while</code> as:
Mind you, it is also normal to write this task using a normal <code>while</code> as:
<lang tcl>set i 0
<syntaxhighlight lang="tcl">set i 0
while true {
while true {
puts [incr i]
puts [incr i]
if {$i % 6 == 0} break
if {$i % 6 == 0} break
}</lang>
}</syntaxhighlight>


=={{header|TUSCRIPT}}==
=={{header|TUSCRIPT}}==
<lang tuscript>
<syntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
$$ MODE TUSCRIPT
var=0
var=0
Line 2,866: Line 3,213:
IF (rest==0) EXIT
IF (rest==0) EXIT
ENDLOOP
ENDLOOP
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 2,881: Line 3,228:
{{works with|pdksh}}
{{works with|pdksh}}
{{works with|zsh}}
{{works with|zsh}}
<lang bash>val=0
<syntaxhighlight lang="bash">val=0
while true; do
while true; do
echo $((++val))
echo $((++val))
[ $((val%6)) -eq 0 ] && break
[ $((val%6)) -eq 0 ] && break
done</lang>
done</syntaxhighlight>


{{works with|Bourne Shell}}
{{works with|Bourne Shell}}
<lang bash>val=0
<syntaxhighlight lang="bash">val=0
while true; do
while true; do
val=`expr $val + 1`
val=`expr $val + 1`
echo $val
echo $val
expr $val % 6 = 0 >/dev/null && break
expr $val % 6 = 0 >/dev/null && break
done</lang>
done</syntaxhighlight>


{{works with|zsh}}
{{works with|zsh}}
<lang bash>for ((val=1;;val++)) {
<syntaxhighlight lang="bash">for ((val=1;;val++)) {
print $val
print $val
(( val % 6 )) || break
(( val % 6 )) || break
}</lang>
}</syntaxhighlight>


=={{header|Vala}}==
=={{header|Vala}}==
<lang vala> int a = 0;
<syntaxhighlight lang="vala"> int a = 0;


do {
do {
Line 2,909: Line 3,256:
}
}
while ( a % 6 != 0);
while ( a % 6 != 0);
</syntaxhighlight>
</lang>

=={{header|VBA}}==
<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</lang>{{out}}<pre> 1 2 3 4 5 6 </pre>


=={{header|Vedit macro language}}==
=={{header|Vedit macro language}}==
<lang vedit>#1 = 0
<syntaxhighlight lang="vedit">#1 = 0
do {
do {
#1++
#1++
Num_Type(#1)
Num_Type(#1)
} while (#1 % 6 != 0);</lang>
} while (#1 % 6 != 0);</syntaxhighlight>


=={{header|Verbexx}}==
=={{header|Verbexx}}==
<lang verbexx>// Basic @LOOP until: verb
<syntaxhighlight lang="verbexx">// Basic @LOOP until: verb


@LOOP init:{@VAR n = 0} until:(n % 6 == 0)
@LOOP init:{@VAR n = 0} until:(n % 6 == 0)
Line 2,935: Line 3,272:
n++;
n++;
@SAY n;
@SAY n;
};</lang>
};</syntaxhighlight>



=={{header|Verilog}}==
=={{header|Verilog}}==
<syntaxhighlight lang="verilog">
<lang Verilog>
module main;
module main;
integer i;
integer i;
Line 2,954: Line 3,290:
end
end
endmodule
endmodule
</syntaxhighlight>
</lang>


=={{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}}
=={{header|Visual Basic .NET}}==
<pre>
<lang vbnet>Dim i = 0
Same as before.
Do
</pre>
i += 1
::<syntaxhighlight lang="vlang">fn main() {
Console.WriteLine(i)
// do-while loop 1
Loop Until i Mod 6 = 0</lang>
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}}==
=={{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.
Wren doesn't have a ''do/while'' loop as such but we can simulate it using an infinite loop with a final conditional break.
<lang ecmascript>var v = 0
<syntaxhighlight lang="wren">var v = 0
while (true) {
while (true) {
v = v + 1
v = v + 1
System.print(v)
System.print(v)
if (v%6 == 0) break
if (v%6 == 0) break
}</lang>
}</syntaxhighlight>

{{out}}
{{out}}
<pre>
<pre>
Line 2,983: Line 3,367:
</pre>
</pre>
It can also be simulated ''without'' using a break statement as follows:
It can also be simulated ''without'' using a break statement as follows:
<lang ecmascript>var value = 0
<syntaxhighlight lang="wren">var value = 0
var ok = true
var ok = true
while (ok) {
while (ok) {
Line 2,989: Line 3,373:
System.print(value)
System.print(value)
ok = value%6 != 0
ok = value%6 != 0
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 2,999: Line 3,383:
{{works with|nasm}}
{{works with|nasm}}
{{works with|windows}}
{{works with|windows}}
<lang asm>
<syntaxhighlight lang="asm">
extern _printf
extern _printf


Line 3,025: Line 3,409:
xor eax, eax
xor eax, eax
ret
ret
</syntaxhighlight>
</lang>

=={{header|XBasic}}==
{{works with|Windows XBasic}}
<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
</lang>


=={{header|XPL0}}==
=={{header|XPL0}}==
<lang XPL0>code CrLf=9, IntOut=11;
<syntaxhighlight lang="xpl0">code CrLf=9, IntOut=11;
int V;
int V;
[V:= 0;
[V:= 0;
Line 3,051: Line 3,418:
IntOut(0, V); CrLf(0);
IntOut(0, V); CrLf(0);
until rem(V/6) = 0;
until rem(V/6) = 0;
]</lang>
]</syntaxhighlight>


=={{header|Yorick}}==
=={{header|Yorick}}==
<lang yorick>val = 0;
<syntaxhighlight lang="yorick">val = 0;
do {
do {
val++;
val++;
write, val;
write, val;
} while(val % 6 != 0);</lang>
} while(val % 6 != 0);</syntaxhighlight>


=={{header|zkl}}==
=={{header|zkl}}==
{{trans|Yorick}}
{{trans|Yorick}}
<lang zkl>val := 0;
<syntaxhighlight lang="zkl">val := 0;
do {
do {
val+=1;
val+=1;
val.print(" ");
val.print(" ");
} while(val % 6 != 0);</lang>
} while(val % 6 != 0);</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
1 2 3 4 5 6
1 2 3 4 5 6
</pre>
</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}}
{{omit from|GUISS}}
{{omit from|Commodore BASIC}}

Revision as of 10:06, 18 December 2023

Task
Loops/Do-while
You are encouraged to solve this task according to the task description, using any language you may know.

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


Reference



11l

11l doesn't have a do-while loop.

Translation of: Python
V val = 0
L
   val++
   print(val)
   I val % 6 == 0
      L.break

360 Assembly

Basic

The WTO macro is in SYS1.MACLIB, which needs to be in the SYSLIB concatenation at assembly.

*        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
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.

*        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

6502 Assembly

Code is called as a subroutine (i.e. JSR DoWhileSub). Specific OS/hardware routines for printing are left unimplemented.

DoWhileSub:	PHA
		TYA
		PHA			;push accumulator and Y register onto stack

		LDY #0
DoWhileLoop:	INY
		JSR DisplayValue	;routine not implemented
		TYA
		SEC
Modulus:	SBC #6
		BCS Modulus
		ADC #6
		BNE DoWhileLoop

		PLA
		TAY
		PLA			;restore Y register and accumulator from stack
		RTS			;return from subroutine

AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits
/* 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"


Action!

Proc Main()
 byte A

 A=0
 Do
  A==+1
  PrintBE(A)
  Until A Mod 6=0
 Od
Return

ActionScript

var val:int = 0;
do 
{
    trace(++val);
} while (val % 6);

Ada

loop
   Value := Value + 1;
   Put (Value);
   exit when Value mod 6 = 0;
end loop;

Here is an alternative version:

for Value in 0..Integer'Last loop
   Put (Value);
   exit when Value mod 6 = 0;
end loop;

Agena

Tested with Agena 2.9.5 Win32

scope
    local i := 0;
    do
        inc i, 1;
        print( i )
    as ( i % 6 ) <> 0
epocs

Aime

integer a;

a = 0;
do {
   a += 1;
   o_integer(a);
   o_byte('\n');
} while (a % 6 != 0);

ALGOL 60

Works with: ALGOL 60 version 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.

'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'
Output:
         +1           +2           +3           +4           +5           +6

An alternate ("Goto-less") approach

Works with: A60

While "goto" may (oddly enough) actually be clearer in this particular context, it is possible to avoid it by using the for-while statement and a boolean flag to implement a test-at-the-bottom loop. (Note that though the A60 interpreter permits, it thankfully does not require, the ugly tick marks around reserved words which mar many (but not the Burroughs) ALGOL 60 translators.)

begin

integer i;
boolean another;
i := 0;
another := true;
for i := i + 1 while another do
  begin
    outinteger(1,i);
    comment - repeat until i mod 6 = 0;
    if i = (i div 6) * 6 then another := false;
  end;

end
Output:
 1  2  3  4  5  6

ALGOL 68

FOR value WHILE
  print(value);
# WHILE # value MOD 6 /= 0 DO 
  SKIP
OD

ALGOL W

begin
    integer i;
    i := 0;
    while
        begin
            i := i + 1;
            write( i );
            ( i rem 6 ) not = 0
        end
    do begin end
end.

AmigaE

PROC main()
  DEF i = 0
  REPEAT
    i := i + 1
    WriteF('\d\n', i)
  UNTIL Mod(i, 6) = 0
ENDPROC

ARM Assembly

Works with: as version Raspberry Pi
/* 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

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
Output:
"
1
2
3
4
5
6
"

Arturo

value: 0
until [
	value: value + 1
	print value
] [ 0 = value%6 ]
Output:
1
2
3
4
5
6

Asymptote

Asymptote's control structures are similar to those in C, C++, or Java

int i = 0;
do {
    ++i;
  write(" ", i, suffix=none);
} while (i % 6 != 0);

AutoHotkey

While mod(A_Index, 6) ;comment:everything but 0 is considered true
  output = %output%`n%A_Index%
MsgBox % output

AWK

BEGIN {
  val = 0
  do {
    val++
    print val
  } while( val % 6 != 0)
}

Axe

While Axe does not have explicit do-while loops, they can be easily emulated using an infinite loop with a conditional terminator:

0→A
While 1
 A++
 Disp A▶Dec,i
End!If A^6

BASIC

Applesoft BASIC

Works with: Commodore BASIC
 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

ASIC

ASIC does not have a do .. while construct. Equivalent using WHILE:

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
Output:
     1
     2
     3
     4
     5
     6

Equivalent using conditional jump:

REM Loops/Do-while 

I = 0
LoopStart:
  I = I + 1
  PRINT I
  IMod6 = I MOD 6
  IF IMod6 <> 0 THEN LoopStart:

END
Output:

As above

BaCon

a=0
REPEAT
    INCR a
    PRINT a
UNTIL  MOD(a,6)  == 0

BASIC256

i = 0

do
	i += 1
	print i; " ";
until i mod 6 = 0
print
end

BBC BASIC

a = 0
REPEAT
  a = a + 1
  PRINT a
UNTIL a MOD 6 = 0

Chipmunk Basic

In Chipmunk Basic Man Page, the words do, loop, and until are mentioned as reserved, but the do .. loop until 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 while .. wend).

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
Output:
     1
     2
     3
     4
     5
     6

Commodore 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

FreeBASIC

' FB 1.05. 0 Win64

Dim i As Integer = 0
Do
  i += 1
  Print i; " ";
Loop While i Mod 6 <> 0
Print
Sleep
Output:
 1  2  3  4  5  6

FutureBasic

window 1

dim as long i

do
  i++
  print i
until ( i mod 6 == 0 )

HandleEvents
Output:
 1
 2
 3
 4
 5
 6

Gambas

Click this link to run this code

Public Sub Main()
Dim siCount As Short

Repeat
  Inc siCount
  Print siCount;;
Until siCount Mod 6 = 0

End
Output:
1 2 3 4 5 6

GW-BASIC

GW-BASIC does not have a do .. while construct. Equivalent using WHILE:

Works with: BASICA
Works with: PC-BASIC version any
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

Equivalent using GOTO:

Works with: BASICA
Works with: PC-BASIC version any
10 LET I% = 0
20  LET I% = I% + 1
30  PRINT I%
40  IF I% MOD 6 <> 0 THEN GOTO 20

IS-BASIC

100 LET I=0
110 DO 
120   LET I=I+1
130   PRINT I
140 LOOP UNTIL MOD(I,6)=0

Liberty BASIC

Works with: Just BASIC
a = 0
do
  a  = a + 1
  print a
loop until (a mod 6) = 0

See also QBasic.

Microsoft Small Basic

Microsoft Small Basic does not have a do .. while construct. Equivalent using While:

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

Equivalent using Goto:

i = 0
loopStart:
i = i + 1
TextWindow.WriteLine(i)
If Math.Remainder(i, 6) <> 0 Then 
  Goto loopStart
EndIf

Minimal BASIC

Minimal BASIC does not have a do .. while construct. Equivalent using conditional jump:

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

MSX Basic

The Minimal BASIC solution works without any changes.

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."

PureBasic

Works with: PureBasic version 4.41
x=0
Repeat
  x+1
  Debug x
Until x%6=0

QB64

CBTJD: 2020/03/14

DO
    PRINT n
    n = n + 1
LOOP WHILE n MOD 6 <> 0
'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

QBasic

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5
Works with: Just BASIC
a = 0
DO
  a = a + 1
  PRINT a;
LOOP WHILE a MOD 6 <> 0

Quite BASIC

The Minimal BASIC solution works without any changes.

Run BASIC

Run Basic does not have a do .. while construct. Equivalent using conditional jump:

i = 0
[start]
i = i +1
print i; " ";
if i mod 6 <> 0 then [start]

Sinclair ZX81 BASIC

10 LET X=0
20 LET X=X+1
30 PRINT X
40 IF X/6<>INT (X/6) THEN GOTO 20

Tiny BASIC

Tiny Basic does not have a do .. while construct. Equivalent using conditional jump:

Works with: TinyBasic
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
Output:
1
2
3
4
5
6

True BASIC

LET i = 0

DO
   LET i = i + 1
   PRINT i; " ";
LOOP WHILE REMAINDER(i, 6) <> 0
PRINT 
END

VBA

Public Sub LoopDoWhile()
    Dim value As Integer
    value = 0
    Do
        value = value + 1
        Debug.Print value;
    Loop While value Mod 6 <> 0
End Sub
Output:
 1  2  3  4  5  6 

Visual Basic .NET

Dim i = 0
Do
    i += 1
    Console.WriteLine(i)
Loop Until i Mod 6 = 0

XBasic

Works with: Windows 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

Yabasic

i = 0
 
repeat
	i = i + 1
	print i, " ";
until mod(i, 6) = 0
print

bc

i = 0
for (;;) {
	++i	/* increments then prints i */
	if (i % 6 == 0) break
}
quit

Befunge

0>1+:.v
 |%6: <
 @

C

int val = 0;
do{
   val++;
   printf("%d\n",val);
}while(val % 6 != 0);

C#

int a = 0;

do
{
    a += 1;
    Console.WriteLine(a);
} while (a % 6 != 0);

C++

int val = 0;
do{
   val++;
   std::cout << val << std::endl;
}while(val % 6 != 0);

C3

In this example we use default zero initialization of locals in C3.

int val;
do 
{
  io::printn(++val);
} 
while (val % 6 != 0);

Chapel

var val = 0;
do {
        val += 1;
        writeln(val);
} while val % 6 > 0;

ChucK

0 => int value;
do
{
    value++;
    <<<value>>>;
}
while(value % 6 != 0);

Clipper

   Local n := 0
   DO WHILE .T.
      ? ++n
      IF n % 6 == 0
         EXIT
      ENDIF
   ENDDO

Clojure

(loop [i 0]
  (let [i* (inc i)]
    (println i*)
    (when-not (zero? (mod i* 6))
      (recur i*))))

COBOL

The COBOL equivalent of a do-while loop is PERFORM WITH TEST AFTER UNTIL some-condition.

       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
           .

Coco

Do-while loops are a JavaScript feature removed in CoffeeScript but re-added in Coco.

v = 0
do
   console.log ++v
while v % 6

CoffeeScript

CoffeeScript doesn't have do {} while () loop, but it can be emulated using loop statement and break unless statement.

val = 0
loop
  console.log ++val
  break unless val % 6

ColdFusion

<cfscript>
  value = 0;
  do
  {
    value += 1;
    writeOutput( value );
  } while( value % 6 != 0 );			
</cfscript>

Common Lisp

(let ((val 0))
  (loop do
        (incf val)
        (print val)
        while (/= 0 (mod val 6))))

loop can set up temporary values, and incf returns a value, so it's also possible to do

(loop with val = 0
      do (print (incf val))
      until (= 0 (mod val 6)))

Using DO

(do* ((a 0)		     ; Initialize to 0
      (b (incf a) (incf b))) ; Set first increment and increment on every loop
     ((zerop (mod b 6)) (print b)) ; Break condition and print last value `6' (right?)
  (print b))			   ; On every loop print value
Output:
1 
2 
3 
4 
5 
6 

D

import std.stdio;

void main() {
    int val;
    do {
        val++;
        write(val, " ");
    } while (val % 6 != 0);
}
Output:
1 2 3 4 5 6 

Dart

void main() {
  int val = 0;
  do {
    val++;
    print(val);
  } while (val % 6 != 0);
}

dc

Translation of: bc
0 si		[i = 0]sz
[2Q]sA		[A = code to break loop]sz
[
 li 1 + p	[print it = i + 1]sz
 d si		[i = it, leave it on stack]sz
 6 % 0 =A	[call A if 0 == it % 6]sz
 0 0 =B		[continue loop]sz
]sB 0 0 =B

Delphi

program Loop;

{$APPTYPE CONSOLE}

var
  I: Integer;

begin
  I:= 0;
  repeat
    Inc(I);
    Write(I:2);
  until I mod 6 = 0;
  Writeln;
  Readln;
end.

Draco

proc nonrec main() void:
    byte i;
    i := 0;
    while
        i := i + 1;
        write(i:2);
        i % 6 ~= 0
    do od
corp
Output:
 1 2 3 4 5 6

Dragon

val = 0
do{
   val++
   showln val
}while(val % 6 != 0)

DUP

DUP only provides a while loop in the form of [condition][block]#, 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):

[1+$.' ,]⇒A   {operator definition: PUSH 1, ADD, DUP, print top of stack to SDTOUT, print whitespace}
[1+$.' ,]a:    {function definition}

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):

[1+$.' ,]⇒A
0 A[$6/%][A]#    {PUSH 0, execute operator A, [DUP, PUSH 6, MOD/DIV, POP][execute operator A]#}

And if the block is defined as a named function:

[1+$.' ,]a:
0 a;![$6/%][a;!]#

Result:

1 2 3 4 5 6

DWScript

var i := 0;

repeat
   Inc(i);
   PrintLn(i);
until i mod 6 = 0;

Bold text

Dyalect

var x = 0

do
{
    x += 1
    print(x)
} while x % 6 != 0

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.

var x := 0
__loop(fn {
    x += 1
    println(x)
    x % 6 != 0   # this is the return value of the function
})


EasyLang

EasyLang does not include an built-in do-while loop, but a repeat-until loop can be used, with the condition inside a not operator.

value = 0
repeat
   value += 1
   print value
   until value mod 6 = 0
.

Ela

open monad io

loop n | n % 6 == 0 = do return ()
       | else = do 
          putStrLn (show n)
          loop (n+1)

_ = loop 10 ::: IO

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)

Emacs Lisp

The condition form for while can be a progn to evaluate arbitrary code before the loop condition. The body of a while can be empty.

(let ((val 0))
  (while (progn
           (setq val (1+ val))
           (message "%d" val)
           (/= 0 (mod val 6)))))

Alternatively, the loop can be rewritten to check for the exit condition and fulfill it at the end of the loop body.

(let ((val 0) done)
  (while (not done)
    (setq val (1+ val))
    (message "%d" val)
    (setq done (zerop (mod val 6)))))

Erlang

do() ->
	do(0).
	
do(0) ->
	io:fwrite( "0 " ),
        do( 1 );
do(N) when N rem 6 =:= 0 ->
	io:format("~w~n", [N]);
do(N) ->
	io:fwrite( "~p ", [N] ),
	do(N+1).

ERRE

A=0
REPEAT
  A=A+1
  PRINT(A)
UNTIL A MOD 6=0  !UNTIL A-6*INT(A/6)=0 for C-64

Euphoria

Works with: Open 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

F#

If you must have a loop then this is acceptable F#

let rec loop n =
  printfn "%d " n
  if (n+1)%6 > 0 then loop (n+1)
loop 0

But I prefer this way:

Seq.initInfinite id |> Seq.takeWhile(fun n->n=0 || n%6>0) |> Seq.iter (fun n-> printfn "%d" n)

Either produces:

Output:
0
1
2
3
4
5

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.

// 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")
Output:

1
2
3
4
5
6

Factor

0 [ dup 6 mod 0 = not ] [ [ . ] [ 1 + ] bi ] do while drop

Fantom

There is no do-while statement in Fantom, so instead use an infinite while loop with a break statement:

class Main
{
  public static Void main ()
  {
    i := 0
    while (true)
    {
      i += 1
      echo (i)
      if (i % 6 == 0) break // end loop on condition
    }
  }
}

Forth

: do-until
  0
  begin 1+
        dup .
        dup 6 mod 0=
  until
  drop ;

Fortran

Works with: Fortran version 90 and later
INTEGER :: i = 0
DO 
  i = i + 1
  WRITE(*, *) i
  IF (MOD(i, 6) == 0) EXIT
END DO
Works with: Fortran version 77 and later
      PROGRAM DOWHILE
C Initialize modulus and value.
        INTEGER MODLUS, IVALUE
        PARAMETER (MODLUS = 6)
        IVALUE = 0

C FORTRAN 77 has no do-while structure -- not semantically. It is not
C difficult to simulate it using GOTO, however:
   10   CONTINUE
          IVALUE = IVALUE + 1
          WRITE (*,*) IVALUE
        IF (.NOT. (MOD(IVALUE, MODLUS) .EQ. 0)) GOTO 10

        STOP
      END
Works with: Fortran version IV and later
      IVALUE = 0
   10 CONTINUE
        IVALUE=IVALUE+1
        WRITE(6,301) IVALUE
  301   FORMAT(I5)          
      IF(MOD(IVALUE,6).NE.0) GOTO 10
      END
Works with: Fortran version I and later
      IVALUE = 0
   10 IVALUE=IVALUE+1
      WRITE 301,IVALUE
  301 FORMAT(I5)          
      IF(IVALUE-IVALUE/6*6) 10,20,10
   20 STOP
      END

Fortress

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 break equivalent.

component loops_do_while
  export Executable

  var x:ZZ32 = 0
  run() = label loop
    while true do
      x += 1
      println(x)

      if (x MOD 6) = 0
      then exit loop
      end
    end
  end loop
end
Output:
1
2
3
4
5
6

Frink

n = 0
do
{
   n = n + 1
   println[n]
} while n mod 6 != 0

GAP

n := 0;
repeat
    n := n + 1;
    Print(n, "\n");
until RemInt(n, 6) = 0;

GML

i = 0
do
    {
    i += 1
    show_message(string(i))
    }
until (i mod 6 = 0)

Go

There is no explicit do-while in Go, but it can be simulated with a range-based for loop and the break statement.

package main

import "fmt"

func main() {
	var value int
	for {
		value++
		fmt.Println(value)
                if value%6 != 0 {
                        break
                }
	}
}
Output:
1
2
3
4
5
6

It can also be simulated without using a break statement as follows:

package main

import "fmt"

func main() {
	var value int
	for ok := true; ok; ok = value%6 != 0 {
		value++
		fmt.Println(value)
	}
}
Output:
Same as before.
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
}

Groovy

For Groovy 3.0.0 and later.

def i = 0
do {
    i++
    println i
} while (i % 6 != 0)

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.

def i = 0
while (true) {
    i++
    println i
    if (i % 6 == 0) break
}
Output:
1
2
3
4
5
6

Harbour

LOCAL n := 0

DO WHILE .T.
   ? ++n
   IF n % 6 == 0
      EXIT
   ENDIF
ENDDO

Haskell

import Data.List
import Control.Monad
import Control.Arrow

doWhile p f n = (n:) $ takeWhile p $ unfoldr (Just.(id &&& f)) $ succ n

Example executed in GHCi:

*Main> mapM_ print $ doWhile ((/=0).(`mod`6)) succ 0
0
1
2
3
4
5

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.

main :: IO ()
main =
  mapM_ print . reverse $
  until
    (\(x:_) -> (x > 0) && (mod x 6 == 0)) 
    (\xs@(x:_) -> succ x : xs) 
    [0]
Output:
0
1
2
3
4
5
6

With mutable references

Using iterateWhile from monad-loops package

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

Haxe

var val = 0;

do {
  val++;
  Sys.println(val);
} while( val % 6 != 0);

HolyC

U8 i = 0;
do {
   i++;
   Print("%d\n", i);
} while (i % 6 != 0);

Icon and 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 Introduction to Icon and Unicon/Looping Controls for more information.)

procedure main()

i := 0
repeat {
   write(i +:= 1)
   if i % 6 = 0 then break
   }
end

J

J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:

   ,.([^:(0=6|])>:)^:a: 0
0
1
2
3
4
5

This could also be accomplished using Z: to provide early termination from a fold:

   0#]F.(>: [ echo [ _2 Z: * * 0=6|]) 0
0
1
2
3
4
5

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).

3 : 0 ] 0

         NB.  The 'st' in 'whilst' stands for 'skip test'

         whilst. 0 ~: 6 | y do.  
             y 1!:2 ]2 
             y =. y+1
         end.

        i.0 0
   )

Though it's rare to see J code like this.

Java

int val = 0;
do{
   val++;
   System.out.println(val);
}while(val % 6 != 0);

JavaScript

Javascript: Imperative

var val = 0;
do {
  print(++val);
} while (val % 6);

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.

  1. An initial value,
  2. a Do function which transforms that value repetitively, corresponding to the body of the loop,
  3. and a conditional While function.
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')
);

Output:

1
2
3
4
5
6

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:

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')
);

Output:

1
2
3
4
5

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.

(() => {
    '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];
})();
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

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:

// 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());
})();
1
2
3
4
5
6

jq

Works with: jq version 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:

# 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;

The task:

0 | do_while( .+1; . % 6 != 0 )
Output:
1
2
3
4
5

Julia

Julia has no do-while construct. Here is one of several ways to implement do-while behavior.

julia> i = 0
0

julia> while true
           println(i)
           i += 1
           i % 6 == 0 && break
       end
0
1
2
3
4
5

Using a macro that mimics the classic C style do-while.

Notice that the symbol while cannot be used as it is a keyword, which is why when is used instead, also the macro definition is wrapped in a @eval macro invocation since do is also a keyword, but in Julia macro calls are prefixed by @ so this is only an issue during the macro definition, not when invoked, ie. @do block when condition).

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

Here is mostly the same macro, but with the conditional clause used first, which is arguably more readable.

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

Kotlin

// version 1.0.6

fun main(args: Array<String>) {
    var value = 0
    do {
        println(++value)
    }
    while (value % 6 != 0)
}
Output:
1
2
3
4
5
6

LabVIEW

This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.

Lasso

local(x = 0)
while(#x % 6 > 0 || #x == 0) => {^
	++#x
	'\r' // for formatting
^}

Lambdatalk

{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)

Lang

Lang does not have a do-while loop. A simple loop like the example below can be used.

$i = 0
loop {
	$i += 1
	
	fn.println($i)
	
	if(!($i % 6)) {
		con.break
	}
}

Lingo

Lingo has no do..while, but here how this behavior can be implemented:

i = 0
repeat while TRUE
  i = i+1
  put i
  if i mod 6 = 0 then exit repeat
end

Lisaac

+ val : INTEGER;
{
  val := val + 1;
  val.print;
  '\n'.print;
  val % 6 != 0
}.while_do { };

LiveCode

repeat while n mod 6 is not 0 or n is 0
    add 1 to n
    put n
end repeat

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

Lua

Lua doesn't have a do .. while construct.

i=0
repeat
  i=i+1
  print(i)
until i%6 == 0

M2000 Interpreter

Module checkit {
      x=0
      \\ 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
Output:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1
2
3
4
5
6
1
2
3
4
5
6

Maple

val := 0:
do
        val := 1 + val;
        print( val );
        if irem( val, 6 ) = 0 then
                break
        end if;
end do:

Mathematica/Wolfram Language

Because everything is an expression in Mathematica, While[body;condition] tests condition after body has been executed at least once.

value = 0;
While[
 value++;
 Print[value];
 Mod[value,6]!=0
]

MATLAB / Octave

   a=0; 
   while (1) 
      a = a+1; 
      disp(a);
   if (~mod(a,6)) break; end; 	
   end;

Maxima

block([n: 0], do (ldisp(n: n + 1), if mod(n, 6) = 0 then return('done)))$

MAXScript

a = 0
do
(
    print a
    a += 1
)
while mod a 6 != 0

Metafont

Metafont has no a do-while construct; the same thing can be done using a forever loop and exitif.

a := 0;
forever: show a; a := a + 1; exitif a mod 6 = 0; endfor
end

min

Works with: min version 0.19.6
0 (dup 6 mod 0 == over 0 != and) 'pop (puts succ) () linrec

MIPS Assembly

	.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

МК-61/52

0	П4	КИП4	ИП4	6	/	{x}	x=0	02	С/П

Modula-2

MODULE DoWhile;
  IMPORT InOut;

  VAR
    i: INTEGER;

BEGIN
  i := 0;
  REPEAT
    INC(i);
    InOut.WriteInt(i, 1);
    InOut.WriteLn;    
  UNTIL i MOD 6 = 0;
END DoWhile.

Modula-3

This is very similar to the Modula-2 code above.

REPEAT
  i := i + 1;
  IO.Put(Fmt.Int(i));
UNTIL i MOD 6 = 0;

Monicelli

The do-while loop is the only kind of loop available in Monicelli

stuzzica
    ...     # loop body
e brematura anche, se <expr> # exit if <expr> is false

MUMPS

DOWHILELOOP
    set val = 0    
    do {
        set val = val + 1
        write val,!
    } while ((val # 6) '= 0)
    
    quit
Output:

SAMPLES>do ^DOWHILELOOP 1 2 3 4 5 6

Neko

/**
 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
Output:
prompt$ nekoc loops-do-while.neko
prompt$ neko loops-do-while
1
2
3
4
5
6

Nemerle

mutable x = 0;
do
{
    x++;
    WriteLine($"$x");
} while (x % 6 != 0)

NetRexx

In NetRexx the do–while construct is implemented via the until expru conditional clause of the loop instruction. The expression expru in the until expru clause is evaluated at the end of the loop, guaranteeing that the loop will be executed at least once.

/* NetRexx */
options replace format comments java crossref savelog symbols nobinary

  say
  say 'Loops/Do-while'

  i_ = 0
  loop until i_ // 6 = 0
    i_ = i_ + 1
    say i_
    end

NewLISP

(let ((i 0))
  (do-until (= 0 (% i 6))
	    (println (++ i))))

Nim

Nim does not have a do-while loop. The standard way to simulate it consists in an infinite loop with a break statement:

var val = 0
while true:
  inc val
  echo val
  if val mod 6 == 0: break

It's also easy to write your own doWhile construction (but be aware that the instructions will be duplicated):

template doWhile(a, b: untyped): untyped =
  b
  while a:
    b
 
var val = 0
doWhile val mod 6 != 0:
  inc val
  echo val

Nu

mut n = 0
while true {
	$n += 1
	print $n
	if $n mod 6 == 0 {break}
}

Oberon-2

Works with oo2c Version 2

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.

Objeck

i := 0;
do {
   i += 1;
   i->PrintLine();
} 
while (i % 6 <> 0);

OCaml

OCaml doesn't have a do-while loop, so we can just make a local loop:

let rec loop i =
  let i = succ i in
  Printf.printf "%d\n" i;
  if i mod 6 <> 0 then
    loop i
  in
  loop 0

or implementing a generic do-while iterator with higher order function:

let do_while f p =
  let rec loop() =
    f();
    if p() then loop()
  in
  loop()
(** val do_while : (unit -> 'a) -> (unit -> bool) -> unit *)
let v = ref 0 in
do_while (fun () -> incr v; Printf.printf "%d\n" !v)
         (fun () -> !v mod 6 <> 0)

The example above is the an imperative form, below is its functional counterpart:

let do_while f p ~init =
  let rec loop v =
    let v = f v in
    if p v then loop v
  in
  loop init

do_while (fun v ->
            let v = succ v in
            Printf.printf "%d\n" v;
            (v))
         (fun v -> v mod 6 <> 0)
         ~init:0

Or in a very poor OCaml style, we can use an exception to exit a while loop:

let v = ref 0
exception Exit_loop
try while true do
  incr v;
  Printf.printf "%d\n" !v;
  if not(!v mod 6 <> 0) then
    raise Exit_loop;
done
with Exit_loop -> ()

Octave

The do-while can be changed into a do-until, just negating the condition of the while.

val = 0;
do
  val++;
  disp(val)
until( mod(val, 6) == 0 )

Oforth

0 doWhile: [ 1+ dup . dup 6 rem 0 <> ] drop

OpenEdge/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.

Oz

Normal Oz variables are single-assignment only. So we use a "cell", which is a one-element mutable container.

declare
  I = {NewCell 0}
in
  for until:@I mod 6 == 0 do
     I := @I + 1
     {Show @I}
  end

PARI/GP

The generic Pari loops (while, until) test at the beginning, so just use an infinite loop with a break.

x = 0;
while(1,
  print(x++);
 if(x % 6 == 0, break)
)

If the loop body is something simple then it might be worked into the loop condition. This is obscure but compact.

x = 0;
while (print(x++) || x % 6, )

The condition in while and until is an expression, not a sequence, so ; for multiple statements cannot be used there.

Pascal

program countto6(output);

var
  i: integer;

begin
  i := 0;
  repeat
    i := i + 1;
    writeln(i)
  until i mod 6 = 0
end.

Perl

my $val = 0;
do {
   $val++;
   print "$val\n";
} while ($val % 6);

do ... until (condition) is equivalent to do ... while (not condition).

my $val = 0;
do {
   $val++;
   print "$val\n";
} until ($val % 6 == 0);

Phix

integer x = 0
while 1 do
    x += 1
    ?x
    if mod(x,6)=0 then exit end if
end while

Phixmonti

/# Rosetta Code problem: https://rosettacode.org/wiki/Loops/Do-while
by Galileo, 11/2022 #/

include ..\Utilitys.pmt

0
true while
    1 +
    dup ?
    dup 6 mod
endwhile

PHL

var i = 0;
do {
	i = i::inc;
	printf("%i\n", i);
} while (i%6 != 0);

PHP

$val = 0;
do {
   $val++;
   print "$val\n";
} while ($val % 6 != 0);

Picat

do while loop

go =>
  N = 0,
  do
     N := N+1,
     println(N)
  while (N mod 6 != 0).

Recursion

go2 =>
  do_while(0).

do_while(N) :-
  N1 = N + 1,
  println(N1),
  N1 mod 6 != 0,
  do_while(N1).

Both outputs the same.

Output:
1
2
3
4
5
6


PicoLisp

Literally:

(let Val 0
   (loop
      (println (inc 'Val))
      (T (=0 (% Val 6))) ) )

Shorter:

(let Val 0
   (until (=0 (% (println (inc 'Val)) 6))) )

or:

(for (Val 0  (n0 (% (println (inc 'Val)) 6))))

Pike

int main(){
   int value = 0;
   do {
      value++;
      write(value + "\n");
   } while (value % 6);
}

PL/0

PL/0 does not have a do .. while construct. Equivalent using while:

var i;
begin
  i := 0;
  i := i + 1;
  ! i;
  while (i / 6) * 6 <> i do
  begin
    i := i + 1;
    ! i
  end;
end.
Output:
       1
       2
       3
       4
       5
       6

PL/I

dcl value fixed bin (31) init (0);     
do forever;                            
  value = value + 1;                   
                                       
  if mod(value, 6) = 0 then            
    leave;                             
                                       
  put list (value);                    
end;

or shorter:

 dcl value fixed bin(31) init(0);
 do Until(value=6);
   value+=1;
   put Skip list(value);
 end;
Output:
             1
             2
             3
             4
             5
             6     

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.

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.

Pop11

lvars val = 0;
while true do
   val + 1 -> val;
   printf(val, '%p\n');
   quitif(val rem 6 = 0);
endwhile;

PowerShell

$n = 0
do {
    $n++
    $n
} while ($n % 6 -ne 0)

Prolog

% initial condition
do(0):- write(0),nl,do(1).

% control condition
do(V):- 0 is mod(V,6), !, fail.

% loop
do(V) :-
    write(V),nl,
    Y is V + 1,
    do(Y).

wloop :-
   do(0).

Python

Python doesn't have a do-while loop.

val = 0
while True:
   val +=1
   print val
   if val % 6 == 0: break

or repeat the body of the loop before a standard while.

val = 1
print val
while val % 6 != 0:
   val += 1
   print val

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. until means jump to [ if ToS is false.

0 [ 1+ dup echo cr
    dup 6 mod 0 = until ] drop

R

i <- 0
repeat
{
   i <- i + 1
   print(i)
   if(i %% 6 == 0) break
}

Racket

Idiomatic Racket code is functional:

#lang racket
(let loop ([n 0])
  (let ([n (add1 n)])
    (displayln n)
    (unless (zero? (modulo n 6)) (loop n))))

But an imperative version is easy to do too:

#lang racket
(define n 0)
(let loop ()
  (set! n (add1 n))
  (displayln n)
  (unless (zero? (modulo n 6)) (loop)))

Raku

(formerly Perl 6)

Works with: Rakudo Star version 2010.08
my $val = 0;
repeat {
    say ++$val;
} while $val % 6;

repeat ... until condition is equivalent to do ... while not condition.

my $val = 0;
repeat {
    say ++$val;
} until $val %% 6;

(Here we've used %%, the "divisible-by" operator.)

You can also put the condition before the block, without changing the order of evaluation.

my $val = 0;
repeat while $val % 6 {
    say ++$val;
}

REBOL

REBOL [
	Title: "Loop/While"
	URL: http://rosettacode.org/wiki/Loop/Do_While
]

; REBOL doesn't have a specific 'do/while' construct, but 'until' can
; be used to provide the same effect.

value: 0
until [
	value: value + 1
	print value

	0 = mod value 6
]
Output:
1
2
3
4
5
6

Red

Red []
i: 0
until [
  ?? i
  i: i + 1
  i % 6 = 0 ;; loop , until this is true...
]
Output:
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5

REXX

In the DO UNTIL construct, the expression is evaluated at the end of the DO loop,
even though it is written at the beginning.
This insures that the DO UNTIL loop will execute at least once (as coded below).

In contrast, a DO WHILE construct, the expression would be evaluated at the beginning of the DO loop, and
may cause the DO WHILE loop to not execute at all.
This necessitates the use of DO UNTIL instead of DO WHILE.

version 1

/*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.*/
Output:
1
2
3
4
5
6

version 2

/*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.*/

output is the same as the 1st version.

Ring

   n = 0
   While True
      n++  See n + nl
      if n % 6 = 0  exit ok
   end

RPL

To ensure at least one loop, DO..UNTIL..END must be used rather than WHILE..REPEAT..END. To actually print (on paper) instead of pushing in the stack successive results, the DUP instruction inside the loop shall be replaced by PR1

≪ 0
   DO
      1 + DUP
   UNTIL DUP 6 MOD 0 == END 
   DROP
≫

Ruby

The while statement modifier normally checks the condition before entering the loop. But if the while statement modifier is on a begin ... end statement, then it loops at least once. Same with the until statement modifier.

while until
val = 0
begin
   val += 1
   puts val
end while val % 6 != 0
val = 0
begin
   val += 1
   puts val
end until val % 6 == 0

During November 2005, Yukihiro Matsumoto, the creator of Ruby, regretted this loop feature and suggested using Kernel#loop.

break unless break if
val = 0
loop do
   val += 1
   puts val
   break unless val %6 != 0
end
val = 0
loop do
   val += 1
   puts val
   break if val %6 == 0
end

All four of these examples print the numbers 1, 2, 3, 4, 5, 6.

Rust

Rust does not have a do...while loop. Instead, the keyword loop is used with a termination condition.

let mut x = 0;

loop {
    x += 1;
    println!("{}", x);

    if x % 6 == 0 { break; }
}

Salmon

variable x := 0;
do
  {
    ++x;
    x!
  }
while (x % 6 != 0);

SAS

/* using DO UNTIL so that the loop executes at least once */
data _null_;
n=0;
do until(mod(n,6)=0);
    n+1;
    put n;
end;
run;

Sather

Translation of: C
class MAIN is
  main is
    val ::= 0;
    loop
      val := val + 1;
      #OUT + val + "\n";
      while!(val % 6 /= 0)
    end;
  end;
end;

Scala

Library: Scala

Imperative

  {
    var (x, l) = (0, List[Int]())
    do {
      x += 1
      l :+= x // A new copy of this list with List(x) appended.
    } while (x % 6 != 0)
    l
  }.foreach(println(_))

Tail recursive

	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))

Stream

  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(_))

Scheme

(let loop ((i 1))
  (display i)
  (if (positive? (modulo i 6))
      (loop (+ i 1))))

Scilab

Works with: Scilab version 5.5.1
v=0
while %T
    v=v+1
    printf("%2d ",v)
    if modulo(v,6)==0 then break; end
end
printf("\n")
Output:
 1  2  3  4  5  6 

Seed7

$ include "seed7_05.s7i";

const proc: main is func
  local
    var integer: number is 0;
  begin
    repeat
      incr(number);
      writeln(number)
    until number rem 6 = 0
  end func;

Sidef

var value = 0;
do {
    say ++value;
} while (value % 6);

Slate

[| val |
  val: 0.
  [val: val + 1.
   print: val.
   val \\ 6 ~= 0] whileTrue
] do.

Smalltalk

|val|
val := 0.
[ 
  val := val + 1.
  val displayNl.
] doWhile: [ (val rem: 6) ~= 0 ]
|val|
val := 0.
[ 
  val := val + 1.
  val displayNl.
] doUntil: [ (val rem: 6) == 0 ]

To simulate the do-while construct, we can use the whileTrue: method of a block with a void while block.

|val|
val := 0.
[ 
  val := val + 1.
  val displayNl.
  (val rem: 6) ~= 0
] whileTrue: [ ]

Or send the loop block a whileTrue message (without argument).

|val|
val := 0.
[ 
  val := val + 1.
  val displayNl.
  (val rem: 6) ~= 0
] whileTrue

Corresponding false-checking messages are whileFalse: and whileFalse (without argument)

Sparkling

var i = 0;
do {
    print(++i);
} while (i % 6 != 0);

Spin

Works with: BST/BSTC
Works with: FastSpin/FlexSpin
Works with: HomeSpun
Works with: OpenSpin
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)
Output:
1 2 3 4 5 6 

SPL

n = 0
>
  n += 1
  #.output(n)
< n%6
Output:
1
2
3
4
5
6

Stata

Stata macro language has no do/while loop, but it's possible to achieve this with a 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.

local n 0
local q 1
while `q' | mod(`n',6) {
	local q 0
	di `++n'
}

Use an infinite while loop and do the test with an if' at the end of the loop.

local n 0
while 1 {
	di `++n'
	if mod(`n',6)==0 continue, break
}

Mata

Mata has a do/while loop:

mata
n=0
do {
	printf("%f\n",++n)
} while (mod(n,6))
end

Suneido

val = 0
do
    {
    Print(++val)
    } while (val % 6 isnt 0)
Output:
1
2
3
4
5
6

Swift

Works with: Swift version 3.x+
var val = 0
repeat {
  val += 1
  print(val)
} while val % 6 != 0
Works with: Swift version 2.x
var val = 0
repeat {
  val++
  print(val)
} while val % 6 != 0
Works with: Swift version 1.x
var val = 0
do {
   val++
   println(val)
} while val % 6 != 0

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.

templates doWhile
  0 -> #
  <> def val: $ + 1;
    $val -> !OUT::write
    $val -> \(<?($ mod 6 <~=0>)> $!\) -> #
end doWhile

Tcl

Tcl does not have a built-in do...while construct. This example demonstrates the ease of creating new looping contructs in plain Tcl. do procedure taken from Tcler's wiki

proc do {body keyword expression} {
    if {$keyword eq "while"} {
       set expression "!($expression)"
    } elseif {$keyword ne "until"} {
       return -code error "unknown keyword \"$keyword\": must be until or while"
    }
    set condition [list expr $expression]
    while 1 {
       uplevel 1 $body
       if {[uplevel 1 $condition]} {
          break
       }
    }
    return
}

set i 0
do {puts [incr i]} while {$i % 6 != 0}
Library: Tcllib (Package: control)
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}

Mind you, it is also normal to write this task using a normal while as:

set i 0
while true {
    puts [incr i]
    if {$i % 6 == 0} break
}

TUSCRIPT

$$ MODE TUSCRIPT
var=0
LOOP
var=var+1, rest=var%6
PRINT var
IF (rest==0) EXIT
ENDLOOP
Output:
1
2
3
4
5
6

UNIX Shell

Works with: bash
Works with: pdksh
Works with: zsh
val=0
while true; do
  echo $((++val))
  [ $((val%6)) -eq 0 ] && break
done
Works with: Bourne Shell
val=0
while true; do
  val=`expr $val + 1`
  echo $val
  expr $val % 6 = 0 >/dev/null && break
done
Works with: zsh
for ((val=1;;val++)) {
  print $val
  (( val % 6 )) || break
}

Vala

  int a = 0;

  do {
    a++;
    print(a.to_string() + "\n");
  } 
  while ( a % 6 != 0);

Vedit macro language

#1 = 0
do {
    #1++
    Num_Type(#1)
} while (#1 % 6 != 0);

Verbexx

//  Basic @LOOP until: verb

@LOOP init:{@VAR n = 0} until:(n % 6 == 0) 
{
     n++;
     @SAY n; 
};

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

V (Vlang)

Translation of: go

There is no explicit do-while in Vlang, but it can be simulated with a range-based for loop and the break statement.

fn main() {
	mut value := 0
	for {
		value++
		println(value)
                if value%6 != 0 {
                        break
                }
	}
}
Output:
1
2
3
4
5
6

It can also be simulated without using a break statement as follows:

fn main() {
	mut value := 0
	for ok := true; ok; ok = value%6 != 0 {
		value++
		println(value)
	}
}
Output:
Same as before.
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
}

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.

var v = 0
while (true) {
    v = v + 1
    System.print(v)
    if (v%6 == 0) break
}
Output:
1
2
3
4
5
6

It can also be simulated without using a break statement as follows:

var value = 0
var ok = true
while (ok) {
    value = value + 1
    System.print(value)
    ok = value%6 != 0
}
Output:
Same as before.

X86 Assembly

Works with: nasm
Works with: windows
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

XPL0

code CrLf=9, IntOut=11;
int V;
[V:= 0;
repeat  V:= V+1;
        IntOut(0, V);  CrLf(0);
until   rem(V/6) = 0;
]

Yorick

val = 0;
do {
    val++;
    write, val;
} while(val % 6 != 0);

zkl

Translation of: Yorick
val := 0;
do {
    val+=1;
    val.print(" ");
} while(val % 6 != 0);
Output:
1 2 3 4 5 6

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});
    }
}