Loops/N plus one half: Difference between revisions

From Rosetta Code
Content added Content deleted
imported>Katsumi
imported>Katsumi
No edit summary
Line 3: Line 3:


Quite often one needs loops which, in the last iteration, execute only part of the loop body.
Quite often one needs loops which, in the last iteration, execute only part of the loop body.



;Goal:
;Goal:
Demonstrate the best way to do this.
Demonstrate the best way to do this.



;Task:
;Task:
Line 14: Line 12:
using separate output statements for the number
using separate output statements for the number
and the comma from within the body of the loop.
and the comma from within the body of the loop.



;Related tasks:
;Related tasks:
*   [[Loop over multiple arrays simultaneously]]
* [[Loop over multiple arrays simultaneously]]
*   [[Loops/Break]]
* [[Loops/Break]]
*   [[Loops/Continue]]
* [[Loops/Continue]]
*   [[Loops/Do-while]]
* [[Loops/Do-while]]
*   [[Loops/Downward for]]
* [[Loops/Downward for]]
*   [[Loops/For]]
* [[Loops/For]]
*   [[Loops/For with a specified step]]
* [[Loops/For with a specified step]]
*   [[Loops/Foreach]]
* [[Loops/Foreach]]
*   [[Loops/Increment loop index within loop body]]
* [[Loops/Increment loop index within loop body]]
*   [[Loops/Infinite]]
* [[Loops/Infinite]]
*   [[Loops/N plus one half]]
* [[Loops/N plus one half]]
*   [[Loops/Nested]]
* [[Loops/Nested]]
*   [[Loops/While]]
* [[Loops/While]]
*   [[Loops/with multiple ranges]]
* [[Loops/with multiple ranges]]
*   [[Loops/Wrong ranges]]
* [[Loops/Wrong ranges]]
<br><br>


=={{header|11l}}==
=={{header|11l}}==
<syntaxhighlight lang="11l">L(i) 1..10
<syntaxhighlight lang="11l">
L(i) 1..10
print(i, end' ‘’)
print(i, end' ‘’)
I !L.last_iteration
I !L.last_iteration
print(‘, ’, end' ‘’)</syntaxhighlight>
print(‘, ’, end' ‘’)
</syntaxhighlight>


=={{header|360 Assembly}}==
=={{header|360 Assembly}}==
Line 73: Line 71:
=={{header|68000 Assembly}}==
=={{header|68000 Assembly}}==
Sega Genesis cartridge header and hardware print routines/bitmap font are omitted here but do work as intended.
Sega Genesis cartridge header and hardware print routines/bitmap font are omitted here but do work as intended.
<syntaxhighlight lang="68000devpac"> moveq #0,d0
<syntaxhighlight lang="68000devpac">
moveq #0,d0
move.w #1,d1 ;ABCD can't use an immediate operand
move.w #1,d1 ;ABCD can't use an immediate operand
move.w #10-1,d2
move.w #10-1,d2
Line 96: Line 95:
; include "X:\SrcGEN\testModule.asm"
; include "X:\SrcGEN\testModule.asm"
jmp *</syntaxhighlight>
jmp *
</syntaxhighlight>
{{out}}
{{out}}
<pre>01, 02, 03, 04, 05, 06, 07, 08, 09, 10</pre>
<pre>01, 02, 03, 04, 05, 06, 07, 08, 09, 10</pre>
Line 103: Line 103:
Since the output of the last element is different than the rest, the easiest way to accomplish this is by "breaking out" of the loop with a comparison to 10.
Since the output of the last element is different than the rest, the easiest way to accomplish this is by "breaking out" of the loop with a comparison to 10.


<syntaxhighlight lang="asm"> .model small
<syntaxhighlight lang="asm">
.model small
.stack 1024
.stack 1024


Line 156: Line 157:
pop ax
pop ax
ret
ret
end start ;EOF</syntaxhighlight>
end start ;EOF
</syntaxhighlight>


{{out}}
{{out}}
Line 239: Line 241:
ACL2 does not have loops, but this is close:
ACL2 does not have loops, but this is close:


<syntaxhighlight lang="lisp">(defun print-list (xs)
<syntaxhighlight lang="lisp">
(defun print-list (xs)
(progn$ (cw "~x0" (first xs))
(progn$ (cw "~x0" (first xs))
(if (endp (rest xs))
(if (endp (rest xs))
(cw (coerce '(#\Newline) 'string))
(cw (coerce '(#\Newline) 'string))
(progn$ (cw ", ")
(progn$ (cw ", ")
(print-list (rest xs))))))</syntaxhighlight>
(print-list (rest xs))))))
</syntaxhighlight>


=={{header|Action!}}==
=={{header|Action!}}==
Line 258: Line 262:
i==+1
i==+1
OD
OD
RETURN</syntaxhighlight>
RETURN
</syntaxhighlight>
{{out}}
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/N_plus_one_half.png Screenshot from Atari 8-bit computer]
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/N_plus_one_half.png Screenshot from Atari 8-bit computer]
Line 266: Line 271:


=={{header|Ada}}==
=={{header|Ada}}==
<syntaxhighlight lang="ada">with Ada.Text_IO;
<syntaxhighlight lang="ada">
with Ada.Text_IO;


procedure LoopsAndHalf is
procedure LoopsAndHalf is
Line 276: Line 282:
end loop;
end loop;
Ada.Text_IO.new_line;
Ada.Text_IO.new_line;
end LoopsAndHalf;</syntaxhighlight>
end LoopsAndHalf;
</syntaxhighlight>


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


i = 0;
i = 0;
Line 290: Line 298:
o_text(", ");
o_text(", ");
}
}
o_text("\n");</syntaxhighlight>
o_text("\n");
</syntaxhighlight>


=={{header|ALGOL 60}}==
=={{header|ALGOL 60}}==
{{works with|ALGOL 60|OS/360}}
{{works with|ALGOL 60|OS/360}}
<syntaxhighlight lang="algol60">'BEGIN'
<syntaxhighlight lang="algol60">
'BEGIN'
'COMMENT' Loops N plus one half - Algol60 - 20/06/2018;
'COMMENT' Loops N plus one half - Algol60 - 20/06/2018;
'INTEGER' I;
'INTEGER' I;
Line 301: Line 311:
'IF' I 'NOTEQUAL' 10 'THEN' OUTSTRING(1,'(', ')')
'IF' I 'NOTEQUAL' 10 'THEN' OUTSTRING(1,'(', ')')
'END'
'END'
'END'</syntaxhighlight>
'END'
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 313: Line 324:
There are three common ways of achieving n+½ loops:
There are three common ways of achieving n+½ loops:
{|border="1" style="border-collapse: collapse;"
{|border="1" style="border-collapse: collapse;"
||<syntaxhighlight lang="algol68"> FOR i WHILE
||<syntaxhighlight lang="algol68">
FOR i WHILE
print(whole(i, -2));
print(whole(i, -2));
# WHILE # i < 10 DO
# WHILE # i < 10 DO
Line 320: Line 332:
OD;
OD;


print(new line)</syntaxhighlight>
print(new line)
||<syntaxhighlight lang="algol68">FOR i TO 10 DO
</syntaxhighlight>
||<syntaxhighlight lang="algol68">
FOR i TO 10 DO
print(whole(i, -2));
print(whole(i, -2));
IF i < 10 THEN
IF i < 10 THEN
Line 328: Line 342:
OD;
OD;


print(new line)</syntaxhighlight>
print(new line)
||<syntaxhighlight lang="algol68">FOR i DO
</syntaxhighlight>
||<syntaxhighlight lang="algol68">
FOR i DO
print(whole(i, -2));
print(whole(i, -2));
IF i >= 10 THEN GO TO done FI;
IF i >= 10 THEN GO TO done FI;
Line 336: Line 352:
OD;
OD;
done:
done:
print(new line)</syntaxhighlight>
print(new line)
</syntaxhighlight>
|}
|}
Output for all cases above:
Output for all cases above:
Line 344: Line 361:


=={{header|ALGOL W}}==
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
<syntaxhighlight lang="algolw">
begin
integer i;
integer i;
i := 0;
i := 0;
Line 357: Line 375:
writeon( "," )
writeon( "," )
end
end
end.
end.</syntaxhighlight>
</syntaxhighlight>


=={{header|AmigaE}}==
=={{header|AmigaE}}==
<syntaxhighlight lang="amigae">PROC main()
<syntaxhighlight lang="amigae">
PROC main()
DEF i
DEF i
FOR i := 1 TO 10
FOR i := 1 TO 10
Line 367: Line 387:
WriteF(', ')
WriteF(', ')
ENDFOR
ENDFOR
ENDPROC</syntaxhighlight>
ENDPROC
</syntaxhighlight>


=={{header|ARM Assembly}}==
=={{header|ARM Assembly}}==
Line 503: Line 524:


=={{header|ArnoldC}}==
=={{header|ArnoldC}}==
<syntaxhighlight lang="arnoldc">IT'S SHOWTIME
<syntaxhighlight lang="arnoldc">
IT'S SHOWTIME
HEY CHRISTMAS TREE n
HEY CHRISTMAS TREE n
YOU SET US UP @NO PROBLEMO
YOU SET US UP @NO PROBLEMO
Line 522: Line 544:
ENOUGH TALK
ENOUGH TALK
CHILL
CHILL
YOU HAVE BEEN TERMINATED</syntaxhighlight>
YOU HAVE BEEN TERMINATED
</syntaxhighlight>


=={{header|Arturo}}==
=={{header|Arturo}}==


<syntaxhighlight lang="rebol">print join.with:", " map 1..10 => [to :string]</syntaxhighlight>
<syntaxhighlight lang="rebol">
print join.with:", " map 1..10 => [to :string]
</syntaxhighlight>


{{out}}
{{out}}
Line 533: Line 558:


=={{header|Asymptote}}==
=={{header|Asymptote}}==
<syntaxhighlight lang="Asymptote">for(int i = 1; i <= 10; ++i) {
<syntaxhighlight lang="Asymptote">
for(int i = 1; i <= 10; ++i) {
write(i, suffix=none);
write(i, suffix=none);
if(i < 10) write(", ", suffix=none);
if(i < 10) write(", ", suffix=none);
}
}</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">Loop, 9 ; loop 9 times
<syntaxhighlight lang="autohotkey">
Loop, 9 ; loop 9 times
{
{
output .= A_Index ; append the index of the current loop to the output var
output .= A_Index ; append the index of the current loop to the output var
Line 547: Line 575:
output .= ", " ; append ", " to the output var
output .= ", " ; append ", " to the output var
}
}
MsgBox, %output%</syntaxhighlight>
MsgBox, %output%
</syntaxhighlight>


=={{header|AutoIt}}==
=={{header|AutoIt}}==
<syntaxhighlight lang="autoit">#cs ----------------------------------------------------------------------------
<syntaxhighlight lang="autoit">
#cs ----------------------------------------------------------------------------


AutoIt Version: 3.3.8.1
AutoIt Version: 3.3.8.1
Line 575: Line 605:
EndFunc
EndFunc


main()</syntaxhighlight>
main()
</syntaxhighlight>


=={{header|AWK}}==
=={{header|AWK}}==
'''One-liner:'''
'''One-liner:'''
<syntaxhighlight lang="awk">$ awk 'BEGIN{for(i=1;i<=10;i++){printf i;if(i<10)printf ", "};print}'</syntaxhighlight>
<syntaxhighlight lang="awk">
$ awk 'BEGIN{for(i=1;i<=10;i++){printf i;if(i<10)printf ", "};print}'
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 593: Line 626:
}
}
print
print
}
}</syntaxhighlight>
</syntaxhighlight>
Same output.
Same output.


=={{header|Axe}}==
=={{header|Axe}}==
<syntaxhighlight lang="axe">For(I,1,10)
<syntaxhighlight lang="axe">
For(I,1,10)
Disp I▶Dec
Disp I▶Dec
If I=10
If I=10
Line 604: Line 639:
Disp ","
Disp ","
End
End
End
End</syntaxhighlight>
</syntaxhighlight>


=={{header|BASIC}}==
=={{header|BASIC}}==
Line 611: Line 647:
{{works with|QuickBasic|4.5}}
{{works with|QuickBasic|4.5}}
{{works with|RapidQ}}
{{works with|RapidQ}}
<syntaxhighlight lang="qbasic">DIM i AS Integer
<syntaxhighlight lang="qbasic">
DIM i AS Integer


FOR i=1 TO 10
FOR i=1 TO 10
Line 617: Line 654:
IF i=10 THEN EXIT FOR
IF i=10 THEN EXIT FOR
PRINT ", ";
PRINT ", ";
NEXT i</syntaxhighlight>
NEXT i
</syntaxhighlight>


==={{header|Applesoft BASIC}}===
==={{header|Applesoft BASIC}}===
{{works with|Commodore BASIC}}
{{works with|Commodore BASIC}}
The [[#ZX_Spectrum_Basic|ZX Spectrum Basic]] code will work just fine in Applesoft BASIC. The following is a more structured approach which avoids the use of GOTO.
The [[#ZX_Spectrum_Basic|ZX Spectrum Basic]] code will work just fine in Applesoft BASIC. The following is a more structured approach which avoids the use of GOTO.
<syntaxhighlight lang="applesoftbasic">10 FOR I = 1 TO 10
<syntaxhighlight lang="applesoftbasic">
10 FOR I = 1 TO 10
20 PRINT I;
20 PRINT I;
30 IF I < 10 THEN PRINT ", "; : NEXT I</syntaxhighlight>
30 IF I < 10 THEN PRINT ", "; : NEXT I
</syntaxhighlight>


==={{header|ASIC}}===
==={{header|ASIC}}===
Line 657: Line 697:


==={{header|BASIC256}}===
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">for i = 1 to 10
<syntaxhighlight lang="basic256">
for i = 1 to 10
print i;
print i;
if i < 10 then print ", ";
if i < 10 then print ", ";
next i
next i


end
end</syntaxhighlight>
</syntaxhighlight>


==={{header|BBC BASIC}}===
==={{header|BBC BASIC}}===
<syntaxhighlight lang="bbcbasic"> FOR i% = 1 TO 10
<syntaxhighlight lang="bbcbasic">
FOR i% = 1 TO 10
PRINT ; i% ;
PRINT ; i% ;
IF i% <> 10 PRINT ", ";
IF i% <> 10 PRINT ", ";
NEXT
NEXT
PRINT</syntaxhighlight>
PRINT
</syntaxhighlight>


==={{header|Chipmunk Basic}}===
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">10 rem Loops/N plus one half
<syntaxhighlight lang="qbasic">
10 rem Loops/N plus one half
20 c$ = ""
20 c$ = ""
30 for i = 1 to 10
30 for i = 1 to 10
40 print c$;str$(i);
40 print c$;str$(i);
50 c$ = ", "
50 c$ = ", "
60 next i</syntaxhighlight>
60 next i
</syntaxhighlight>


==={{header|FBSL}}===
==={{header|FBSL}}===
Line 687: Line 733:
IF i < 10 THEN PRINT ", ";
IF i < 10 THEN PRINT ", ";
Next
Next
PAUSE</syntaxhighlight>
PAUSE
</syntaxhighlight>
Output
Output
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Line 693: Line 740:


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


For i As Integer = 1 To 10
For i As Integer = 1 To 10
Line 701: Line 749:


Print
Print
Sleep</syntaxhighlight>
Sleep
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 709: Line 758:
====Alternative====
====Alternative====
This makes the important point that for many loops of this kind the partial iteration could easily be the ''first'' one.
This makes the important point that for many loops of this kind the partial iteration could easily be the ''first'' one.
<syntaxhighlight lang="freebasic">dim as string cm = ""
<syntaxhighlight lang="freebasic">
dim as string cm = ""
for i as ubyte = 1 to 10
for i as ubyte = 1 to 10
print cm;str(i);
print cm;str(i);
cm = ", "
cm = ", "
next i</syntaxhighlight>
next i
</syntaxhighlight>


==={{header|FutureBasic}}===
==={{header|FutureBasic}}===
<syntaxhighlight lang="futurebasic">window 1
<syntaxhighlight lang="futurebasic">
window 1


long i, num = 10
long i, num = 10
Line 726: Line 778:
next i
next i


HandleEvents</syntaxhighlight>
HandleEvents
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 734: Line 787:
==={{header|Gambas}}===
==={{header|Gambas}}===
'''[https://gambas-playground.proko.eu/?gist=c43cc581e5f93e70c5dc82733f609a7e Click this link to run this code]'''
'''[https://gambas-playground.proko.eu/?gist=c43cc581e5f93e70c5dc82733f609a7e Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
<syntaxhighlight lang="gambas">
Public Sub Main()
Dim siLoop As Short
Dim siLoop As Short


Line 742: Line 796:
Next
Next


End
End</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 749: Line 804:


==={{header|GW-BASIC}}===
==={{header|GW-BASIC}}===
<syntaxhighlight lang="gwbasic">10 C$ = ""
<syntaxhighlight lang="gwbasic">
10 C$ = ""
20 FOR I = 1 TO 10
20 FOR I = 1 TO 10
30 PRINT C$;STR$(I);
30 PRINT C$;STR$(I);
40 C$=", "
40 C$=", "
50 NEXT I</syntaxhighlight>
50 NEXT I
</syntaxhighlight>


==={{header|IS-BASIC}}===
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 FOR I=1 TO 10
<syntaxhighlight lang="is-basic">
100 FOR I=1 TO 10
110 PRINT I;
110 PRINT I;
120 IF I=10 THEN EXIT FOR
120 IF I=10 THEN EXIT FOR
130 PRINT ",";
130 PRINT ",";
140 NEXT</syntaxhighlight>
140 NEXT
</syntaxhighlight>


==={{header|Liberty BASIC}}===
==={{header|Liberty BASIC}}===
Line 775: Line 834:


==={{header|Microsoft Small Basic}}===
==={{header|Microsoft Small Basic}}===
<syntaxhighlight lang="smallbasic">For i = 1 To 10
<syntaxhighlight lang="smallbasic">
For i = 1 To 10
TextWindow.Write(i)
TextWindow.Write(i)
If i <> 10 Then
If i <> 10 Then
Line 781: Line 841:
EndIf
EndIf
EndFor
EndFor
TextWindow.WriteLine("")</syntaxhighlight>
TextWindow.WriteLine("")
</syntaxhighlight>


==={{header|NS-HUBASIC}}===
==={{header|NS-HUBASIC}}===
<syntaxhighlight lang="ns-hubasic">10 FOR I=1 TO 10
<syntaxhighlight lang="ns-hubasic">
10 FOR I=1 TO 10
20 PRINT I;
20 PRINT I;
30 IF I=10 THEN GOTO 50
30 IF I=10 THEN GOTO 50
40 PRINT ",";
40 PRINT ",";
50 NEXT</syntaxhighlight>
50 NEXT
</syntaxhighlight>


==={{header|PureBasic}}===
==={{header|PureBasic}}===
<syntaxhighlight lang="purebasic">x=1
<syntaxhighlight lang="purebasic">
x=1
Repeat
Repeat
Print(Str(x))
Print(Str(x))
Line 797: Line 861:
If x>10: Break: EndIf
If x>10: Break: EndIf
Print(", ")
Print(", ")
ForEver</syntaxhighlight>
ForEver
</syntaxhighlight>


==={{header|QBasic}}===
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">FOR i = 1 TO 10
<syntaxhighlight lang="qbasic">
FOR i = 1 TO 10
PRINT USING "##"; i;
PRINT USING "##"; i;
IF i=10 THEN EXIT FOR
IF i=10 THEN EXIT FOR
PRINT ", ";
PRINT ", ";
NEXT i</syntaxhighlight>
NEXT i
</syntaxhighlight>


==={{header|Run BASIC}}===
==={{header|Run BASIC}}===
Line 818: Line 885:
==={{header|Sinclair ZX81 BASIC}}===
==={{header|Sinclair ZX81 BASIC}}===
The [[#ZX_Spectrum_Basic|ZX Spectrum Basic]] program will work on the ZX81. Depending on the context, the programmer's intention may be clearer if we do it all with <code>GOTO</code>s instead of a <code>FOR</code> loop.
The [[#ZX_Spectrum_Basic|ZX Spectrum Basic]] program will work on the ZX81. Depending on the context, the programmer's intention may be clearer if we do it all with <code>GOTO</code>s instead of a <code>FOR</code> loop.
<syntaxhighlight lang="basic">10 LET I=1
<syntaxhighlight lang="basic">
10 LET I=1
20 PRINT I;
20 PRINT I;
30 IF I=10 THEN GOTO 70
30 IF I=10 THEN GOTO 70
40 PRINT ", ";
40 PRINT ", ";
50 LET I=I+1
50 LET I=I+1
60 GOTO 20</syntaxhighlight>
60 GOTO 20
</syntaxhighlight>


==={{header|TI-89 BASIC}}===
==={{header|TI-89 BASIC}}===
There is no horizontal cursor position on the program IO screen, so we concatenate strings instead.
There is no horizontal cursor position on the program IO screen, so we concatenate strings instead.
<syntaxhighlight lang="ti89b">Local str
<syntaxhighlight lang="ti89b">
Local str
"" → str
"" → str
For i,1,10
For i,1,10
Line 835: Line 905:
EndIf
EndIf
EndFor
EndFor
Disp str</syntaxhighlight>
Disp str
</syntaxhighlight>


==={{header|Tiny BASIC}}===
==={{header|Tiny BASIC}}===
Tiny BASIC does not support string concatenation so each number is on a separate line but this is at least in the spirit of the task description.
Tiny BASIC does not support string concatenation so each number is on a separate line but this is at least in the spirit of the task description.
<syntaxhighlight lang="tinybasic"> LET I = 1
<syntaxhighlight lang="tinybasic">
LET I = 1
10 IF I = 10 THEN PRINT I
10 IF I = 10 THEN PRINT I
IF I < 10 THEN PRINT I,", "
IF I < 10 THEN PRINT I,", "
IF I = 10 THEN END
IF I = 10 THEN END
LET I = I + 1
LET I = I + 1
GOTO 10</syntaxhighlight>
GOTO 10
</syntaxhighlight>


A solution for the dialects of Tiny BASIC that support string concatenation.
A solution for the dialects of Tiny BASIC that support string concatenation.
Line 864: Line 937:
==={{header|True BASIC}}===
==={{header|True BASIC}}===
{{works with|QBasic}}
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">LET cm$ = ""
<syntaxhighlight lang="qbasic">
LET cm$ = ""
FOR i = 1 to 10
FOR i = 1 to 10
PRINT cm$; str$(i);
PRINT cm$; str$(i);
LET cm$ = ", "
LET cm$ = ", "
NEXT i
NEXT i
END
END</syntaxhighlight>
</syntaxhighlight>


==={{header|VBA}}===
==={{header|VBA}}===
<syntaxhighlight lang="vb">Public Sub WriteACommaSeparatedList()
<syntaxhighlight lang="vb">
Public Sub WriteACommaSeparatedList()
Dim i As Integer
Dim i As Integer
Dim a(1 To 10) As String
Dim a(1 To 10) As String
Line 879: Line 955:
Next i
Next i
Debug.Print Join(a, ", ")
Debug.Print Join(a, ", ")
End Sub</syntaxhighlight>
End Sub
</syntaxhighlight>


==={{header|Visual Basic .NET}}===
==={{header|Visual Basic .NET}}===
<syntaxhighlight lang="vbnet">For i = 1 To 10
<syntaxhighlight lang="vbnet">
For i = 1 To 10
Console.Write(i)
Console.Write(i)
If i = 10 Then Exit For
If i = 10 Then Exit For
Console.Write(", ")
Console.Write(", ")
Next
Next</syntaxhighlight>
</syntaxhighlight>


==={{header|Wee Basic}}===
==={{header|Wee Basic}}===
print 1 "" ensures the end of program text is separate from the list of numbers.
print 1 "" ensures the end of program text is separate from the list of numbers.
<syntaxhighlight lang="wee basic">print 1 ""
<syntaxhighlight lang="wee basic">
print 1 ""
for numbers=1 to 10
for numbers=1 to 10
print 1 at numbers*3-2,0 numbers
print 1 at numbers*3-2,0 numbers
Line 896: Line 976:
print 1 at numbers*3-1,0 ","
print 1 at numbers*3-1,0 ","
endif
endif
end
end</syntaxhighlight>
</syntaxhighlight>


==={{header|XBasic}}===
==={{header|XBasic}}===
Line 940: Line 1,021:


==={{header|Yabasic}}===
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">for i = 1 to 10
<syntaxhighlight lang="yabasic">
for i = 1 to 10
print i;
print i;
if i < 10 print ", ";
if i < 10 print ", ";
next i
next i
print
print
end
end</syntaxhighlight>
</syntaxhighlight>


==={{header|ZX Spectrum Basic}}===
==={{header|ZX Spectrum Basic}}===
Line 951: Line 1,034:
{{works with|Commodore BASIC}}
{{works with|Commodore BASIC}}
To terminate a loop on the ZX Spectrum, set the loop counter to a value that will exit the loop, before jumping to the NEXT statement.
To terminate a loop on the ZX Spectrum, set the loop counter to a value that will exit the loop, before jumping to the NEXT statement.
<syntaxhighlight lang="zxbasic">10 FOR i=1 TO 10
<syntaxhighlight lang="zxbasic">
10 FOR i=1 TO 10
20 PRINT i;
20 PRINT i;
30 IF i=10 THEN GOTO 50
30 IF i=10 THEN GOTO 50
40 PRINT ", ";
40 PRINT ", ";
50 NEXT i</syntaxhighlight>
50 NEXT i
</syntaxhighlight>


=={{header|bc}}==
=={{header|bc}}==
{{Works with|GNU bc}}
{{Works with|GNU bc}}
The <code>print</code> extension is necessary to get the required output.
The <code>print</code> extension is necessary to get the required output.
<syntaxhighlight lang="bc">while (1) {
<syntaxhighlight lang="bc">
while (1) {
print ++i
print ++i
if (i == 10) {
if (i == 10) {
Line 967: Line 1,053:
}
}
print ", "
print ", "
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Befunge}}==
=={{header|Befunge}}==
<syntaxhighlight lang="befunge">1+>::.9`#@_" ,",,</syntaxhighlight>
<syntaxhighlight lang="befunge">
1+>::.9`#@_" ,",,
</syntaxhighlight>
This code is a good answer. However, most Befunge implementations print a " " after using . (output number), so this program prints "1 , 2 , 3 ..." with extra spaces. A bypass for this is possible, by adding 48 and printing the ascii character, but does not work with 10::
This code is a good answer. However, most Befunge implementations print a " " after using . (output number), so this program prints "1 , 2 , 3 ..." with extra spaces. A bypass for this is possible, by adding 48 and printing the ascii character, but does not work with 10::
<syntaxhighlight lang="befunge">1+>::68*+,8`#v_" ,",,
<syntaxhighlight lang="befunge">
1+>::68*+,8`#v_" ,",,
@,,,,", 10"<</syntaxhighlight>
@,,,,", 10"<
</syntaxhighlight>


=={{header|Bracmat}}==
=={{header|Bracmat}}==
<syntaxhighlight lang="bracmat"> 1:?i
<syntaxhighlight lang="bracmat">
1:?i
& whl
& whl
' ( put$!i
' ( put$!i
& !i+1:~>10:?i
& !i+1:~>10:?i
& put$", "
& put$", "
)</syntaxhighlight>
)
</syntaxhighlight>


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


int main()
int main()
Line 995: Line 1,089:
}
}
return 0;
return 0;
}
}</syntaxhighlight>
</syntaxhighlight>


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


class Program
class Program
Line 1,012: Line 1,108:
Console.WriteLine();
Console.WriteLine();
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|C++}}==
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iostream>
<syntaxhighlight lang="cpp">
#include <iostream>
int main()
int main()
Line 1,030: Line 1,128:


=={{header|Chapel}}==
=={{header|Chapel}}==
<syntaxhighlight lang="chapel">for i in 1..10 do
<syntaxhighlight lang="chapel">
for i in 1..10 do
write(i, if i % 10 > 0 then ", " else "\n")</syntaxhighlight>
write(i, if i % 10 > 0 then ", " else "\n")
</syntaxhighlight>


=={{header|Clojure}}==
=={{header|Clojure}}==
Line 1,049: Line 1,149:
=={{header|COBOL}}==
=={{header|COBOL}}==
{{works with|OpenCOBOL}}
{{works with|OpenCOBOL}}
<syntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
<syntaxhighlight lang="cobol">
IDENTIFICATION DIVISION.
PROGRAM-ID. Loop-N-And-Half.
PROGRAM-ID. Loop-N-And-Half.


Line 1,075: Line 1,176:


GOBACK
GOBACK
.</syntaxhighlight>
.
</syntaxhighlight>
Free-form, 'List'-free version, using DISPLAY NO ADVANCING.
Free-form, 'List'-free version, using DISPLAY NO ADVANCING.
<syntaxhighlight lang="cobol">IDENTIFICATION DIVISION.
<syntaxhighlight lang="cobol">
IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV.
PROGRAM-ID. LOOP-1p5-NOADV.
DATA DIVISION.
DATA DIVISION.
Line 1,094: Line 1,197:
END-PERFORM.
END-PERFORM.
STOP RUN.
STOP RUN.
END-PROGRAM.</syntaxhighlight>
END-PROGRAM.
</syntaxhighlight>
Free-form, GO TO, 88-level. Paragraphs in PROCEDURE DIVISION.
Free-form, GO TO, 88-level. Paragraphs in PROCEDURE DIVISION.
<syntaxhighlight lang="cobol">IDENTIFICATION DIVISION.
<syntaxhighlight lang="cobol">
IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV-GOTO.
PROGRAM-ID. LOOP-1p5-NOADV-GOTO.
DATA DIVISION.
DATA DIVISION.
Line 1,113: Line 1,218:
02-DONE.
02-DONE.
STOP RUN.
STOP RUN.
END-PROGRAM.</syntaxhighlight>
END-PROGRAM.
</syntaxhighlight>
Using 'PERFORM VARYING'
Using 'PERFORM VARYING'
<syntaxhighlight lang="cobol">IDENTIFICATION DIVISION.
<syntaxhighlight lang="cobol">
IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV-VARY.
PROGRAM-ID. LOOP-1p5-NOADV-VARY.
DATA DIVISION.
DATA DIVISION.
Line 1,131: Line 1,238:
END-PERFORM.
END-PERFORM.
STOP RUN.
STOP RUN.
END-PROGRAM.</syntaxhighlight>
END-PROGRAM.
</syntaxhighlight>


=={{header|CoffeeScript}}==
=={{header|CoffeeScript}}==
Line 1,152: Line 1,260:
=={{header|ColdFusion}}==
=={{header|ColdFusion}}==
With tags:
With tags:
<syntaxhighlight lang="cfm"><cfloop index = "i" from = "1" to = "10">
<syntaxhighlight lang="cfm">
<cfloop index = "i" from = "1" to = "10">
#i#
#i#
<cfif i EQ 10>
<cfif i EQ 10>
Line 1,158: Line 1,267:
</cfif>
</cfif>
,
,
</cfloop></syntaxhighlight>
</cfloop>
</syntaxhighlight>


With script:
With script:
<syntaxhighlight lang="cfm"><cfscript>
<syntaxhighlight lang="cfm">
<cfscript>
for( i = 1; i <= 10; i++ ) //note: the ++ notation works only on version 8 up, otherwise use i=i+1
for( i = 1; i <= 10; i++ ) //note: the ++ notation works only on version 8 up, otherwise use i=i+1
{
{
Line 1,172: Line 1,283:
writeOutput( ", " );
writeOutput( ", " );
}
}
</cfscript></syntaxhighlight>
</cfscript>
</syntaxhighlight>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
Line 1,183: Line 1,295:
or
or


<syntaxhighlight lang="lisp">(loop for i from 1 upto 10 do
<syntaxhighlight lang="lisp">
(loop for i from 1 upto 10 do
(princ i)
(princ i)
(if (= i 10) (return))
(if (= i 10) (return))
(princ ", "))</syntaxhighlight>
(princ ", "))
</syntaxhighlight>


but for such simple tasks we can use format's powers:
but for such simple tasks we can use format's powers:
Line 1,218: Line 1,332:


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


var i: uint8 := 1;
var i: uint8 := 1;
Line 1,227: Line 1,342:
i := i + 1;
i := i + 1;
end loop;
end loop;
print_nl();</syntaxhighlight>
print_nl();
</syntaxhighlight>


{{out}}
{{out}}
Line 1,235: Line 1,351:
=={{header|D}}==
=={{header|D}}==
===Iterative===
===Iterative===
<syntaxhighlight lang="d">import std.stdio;
<syntaxhighlight lang="d">
import std.stdio;
void main() {
void main() {
Line 1,246: Line 1,363:


writeln();
writeln();
}
}</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
===Functional Style===
===Functional Style===
<syntaxhighlight lang="d">void main() {
<syntaxhighlight lang="d">
void main() {
import std.stdio, std.range, std.algorithm, std.conv, std.string;
import std.stdio, std.range, std.algorithm, std.conv, std.string;
iota(1, 11).map!text.join(", ").writeln;
iota(1, 11).map!text.join(", ").writeln;
Line 1,256: Line 1,375:
// A simpler solution:
// A simpler solution:
writefln("%(%d, %)", iota(1, 11));
writefln("%(%d, %)", iota(1, 11));
}
}</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Line 1,262: Line 1,382:


=={{header|Dart}}==
=={{header|Dart}}==
<syntaxhighlight lang="dart">String loopPlusHalf(start, end) {
<syntaxhighlight lang="dart">
String loopPlusHalf(start, end) {
var result = '';
var result = '';
for(int i = start; i <= end; i++) {
for(int i = start; i <= end; i++) {
Line 1,276: Line 1,397:
void main() {
void main() {
print(loopPlusHalf(1, 10));
print(loopPlusHalf(1, 10));
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Delphi}}==
=={{header|Delphi}}==


<syntaxhighlight lang="delphi">program LoopsNPlusOneHalf;
<syntaxhighlight lang="delphi">
program LoopsNPlusOneHalf;


{$APPTYPE CONSOLE}
{$APPTYPE CONSOLE}
Line 1,296: Line 1,419:
end;
end;
Writeln;
Writeln;
end.
end.</syntaxhighlight>
</syntaxhighlight>


=={{header|Draco}}==
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec main() void:
<syntaxhighlight lang="draco">
proc nonrec main() void:
byte i;
byte i;
i := 1;
i := 1;
Line 1,309: Line 1,434:
write(", ")
write(", ")
od
od
corp
corp</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
=={{header|DWScript}}==
=={{header|DWScript}}==


<syntaxhighlight lang="delphi">var i : Integer;
<syntaxhighlight lang="delphi">
var i : Integer;


for i := 1 to 10 do begin
for i := 1 to 10 do begin
Line 1,320: Line 1,447:
if i < 10 then
if i < 10 then
Print(', ');
Print(', ');
end;
end;</syntaxhighlight>
</syntaxhighlight>


=={{header|E}}==
=={{header|E}}==


A typical loop+break solution:
A typical loop+break solution:
<syntaxhighlight lang="e">var i := 1
<syntaxhighlight lang="e">
var i := 1
while (true) {
while (true) {
print(i)
print(i)
Line 1,331: Line 1,460:
print(", ")
print(", ")
i += 1
i += 1
}
}</syntaxhighlight>
</syntaxhighlight>


Using the loop primitive in a semi-functional style:
Using the loop primitive in a semi-functional style:


<syntaxhighlight lang="e">var i := 1
<syntaxhighlight lang="e">
var i := 1
__loop(fn {
__loop(fn {
print(i)
print(i)
Line 1,345: Line 1,476:
true
true
}
}
})
})</syntaxhighlight>
</syntaxhighlight>


=={{header|EasyLang}}==
=={{header|EasyLang}}==
Line 1,371: Line 1,503:


=={{header|EDSAC order code}}==
=={{header|EDSAC order code}}==
<syntaxhighlight lang="edsac">[ N and a half times loop
<syntaxhighlight lang="edsac">
[ N and a half times loop
=======================
=======================


Line 1,411: Line 1,544:
[ 25 ] PF
[ 25 ] PF


EZPF</syntaxhighlight>
EZPF
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
Line 1,482: Line 1,616:


=={{header|Elixir}}==
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">defmodule Loops do
<syntaxhighlight lang="elixir">
defmodule Loops do
def n_plus_one_half([]), do: IO.puts ""
def n_plus_one_half([]), do: IO.puts ""
def n_plus_one_half([x]), do: IO.puts x
def n_plus_one_half([x]), do: IO.puts x
Line 1,491: Line 1,626:
end
end


Enum.to_list(1..10) |> Loops.n_plus_one_half</syntaxhighlight>
Enum.to_list(1..10) |> Loops.n_plus_one_half
</syntaxhighlight>


=={{header|Erlang}}==
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">%% Implemented by Arjun Sunel
<syntaxhighlight lang="erlang">
%% Implemented by Arjun Sunel
-module(loop).
-module(loop).
-export([main/0]).
-export([main/0]).
Line 1,547: Line 1,684:


=={{header|Factor}}==
=={{header|Factor}}==
<syntaxhighlight lang="factor">: print-comma-list ( n -- )
<syntaxhighlight lang="factor">
: print-comma-list ( n -- )
[ [1,b] ] keep '[
[ [1,b] ] keep '[
[ number>string write ]
[ number>string write ]
[ _ = [ ", " write ] unless ] bi
[ _ = [ ", " write ] unless ] bi
] each nl ;</syntaxhighlight>
] each nl ;
</syntaxhighlight>


=={{header|Falcon}}==
=={{header|Falcon}}==
<syntaxhighlight lang="falcon">for value = 1 to 10
<syntaxhighlight lang="falcon">
for value = 1 to 10
formiddle
formiddle
>> value
>> value
Line 1,560: Line 1,700:
end
end
forlast: > value
forlast: > value
end
end</syntaxhighlight>
</syntaxhighlight>


{{out}}
{{out}}
Line 1,567: Line 1,708:


=={{header|FALSE}}==
=={{header|FALSE}}==
<syntaxhighlight lang="false">1[$9>~][$.", "1+]#.</syntaxhighlight>
<syntaxhighlight lang="false">
1[$9>~][$.", "1+]#.
</syntaxhighlight>


=={{header|Fantom}}==
=={{header|Fantom}}==
Line 1,588: Line 1,731:


=={{header|Forth}}==
=={{header|Forth}}==
<syntaxhighlight lang="forth">: comma-list ( n -- )
<syntaxhighlight lang="forth">
: comma-list ( n -- )
dup 1 ?do i 1 .r ." , " loop
dup 1 ?do i 1 .r ." , " loop
. ;</syntaxhighlight>
. ;
</syntaxhighlight>


<syntaxhighlight lang="forth">: comma-list ( n -- )
<syntaxhighlight lang="forth">
: comma-list ( n -- )
dup 1+ 1 do
dup 1+ 1 do
i 1 .r
i 1 .r
dup i = if leave then \ or DROP UNLOOP EXIT to exit loop and the function
dup i = if leave then \ or DROP UNLOOP EXIT to exit loop and the function
[char] , emit space
[char] , emit space
loop drop ;</syntaxhighlight>
loop drop ;
</syntaxhighlight>


<syntaxhighlight lang="forth">: comma-list ( n -- )
<syntaxhighlight lang="forth">
: comma-list ( n -- )
1
1
begin dup 1 .r
begin dup 1 .r
2dup <>
2dup <>
while ." , " 1+
while ." , " 1+
repeat 2drop ;</syntaxhighlight>
repeat 2drop ;
</syntaxhighlight>


=={{header|Fortran}}==
=={{header|Fortran}}==
{{works with|FORTRAN|IV and later}}
{{works with|FORTRAN|IV and later}}
<syntaxhighlight lang="fortran">C Loops N plus one half - Fortran IV (1964)
<syntaxhighlight lang="fortran">
C Loops N plus one half - Fortran IV (1964)
INTEGER I
INTEGER I
WRITE(6,301) (I,I=1,10)
WRITE(6,301) (I,I=1,10)
301 FORMAT((I3,','))
301 FORMAT((I3,','))
END</syntaxhighlight>
END
</syntaxhighlight>


{{works with|Fortran|77 and later}}
{{works with|Fortran|77 and later}}


<syntaxhighlight lang="fortran">C WARNING: This program is not valid ANSI FORTRAN 77 code. It uses
<syntaxhighlight lang="fortran">
C WARNING: This program is not valid ANSI FORTRAN 77 code. It uses
C two nonstandard characters on the lines labelled 5001 and 5002.
C two nonstandard characters on the lines labelled 5001 and 5002.
C Many F77 compilers should be okay with it, but it is *not*
C Many F77 compilers should be okay with it, but it is *not*
Line 1,664: Line 1,816:
C5001 FORMAT (T3, ADVANCE='NO')
C5001 FORMAT (T3, ADVANCE='NO')
C5001 FORMAT (A, ADVANCE='NO')
C5001 FORMAT (A, ADVANCE='NO')
END</syntaxhighlight>
END
</syntaxhighlight>


{{Works with|Fortran|90 and later}}
{{Works with|Fortran|90 and later}}


<syntaxhighlight lang="fortran">i = 1
<syntaxhighlight lang="fortran">
i = 1
do
do
write(*, '(I0)', advance='no') i
write(*, '(I0)', advance='no') i
Line 1,675: Line 1,829:
i = i + 1
i = i + 1
end do
end do
write(*,*)</syntaxhighlight>
write(*,*)
</syntaxhighlight>


=={{header|GAP}}==
=={{header|GAP}}==
<syntaxhighlight lang="gap">n := 10;
<syntaxhighlight lang="gap">
n := 10;
for i in [1 .. n] do
for i in [1 .. n] do
Print(i);
Print(i);
Line 1,686: Line 1,842:
Print("\n");
Print("\n");
fi;
fi;
od;
od;</syntaxhighlight>
</syntaxhighlight>


=={{header|GML}}==
=={{header|GML}}==
<syntaxhighlight lang="gml">str = ""
<syntaxhighlight lang="gml">
str = ""
for(i = 1; i <= 10; i += 1)
for(i = 1; i <= 10; i += 1)
{
{
Line 1,696: Line 1,854:
str += ", "
str += ", "
}
}
show_message(str)</syntaxhighlight>
show_message(str)
</syntaxhighlight>


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


import "fmt"
import "fmt"
Line 1,712: Line 1,872:
fmt.Print(", ")
fmt.Print(", ")
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Gosu}}==
=={{header|Gosu}}==
<syntaxhighlight lang="java">var out = System.out
<syntaxhighlight lang="java">
var out = System.out
for(i in 1..10) {
for(i in 1..10) {
if(i > 1) out.print(", ")
if(i > 1) out.print(", ")
out.print(i)
out.print(i)
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Groovy}}==
=={{header|Groovy}}==
Solution:
Solution:
<syntaxhighlight lang="groovy">for(i in (1..10)) {
<syntaxhighlight lang="groovy">
for(i in (1..10)) {
print i
print i
if (i == 10) break
if (i == 10) break
print ', '
print ', '
}
}</syntaxhighlight>
</syntaxhighlight>


Output:
Output:
Line 1,733: Line 1,898:


=={{header|Haskell}}==
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">main :: IO ()
<syntaxhighlight lang="haskell">
main :: IO ()
main = forM_ [1 .. 10] $ \n -> do
main = forM_ [1 .. 10] $ \n -> do
putStr $ show n
putStr $ show n
putStr $ if n == 10 then "\n" else ", "</syntaxhighlight>
putStr $ if n == 10 then "\n" else ", "
</syntaxhighlight>


You can also use intersperse :: a -> [a] -> [a]
You can also use intersperse :: a -> [a] -> [a]
<syntaxhighlight lang="haskell">intercalate ", " (map show [1..10])</syntaxhighlight>
<syntaxhighlight lang="haskell">
intercalate ", " (map show [1..10])
</syntaxhighlight>


=={{header|Haxe}}==
=={{header|Haxe}}==
<syntaxhighlight lang="haxe">for (i in 1...11)
<syntaxhighlight lang="haxe">
for (i in 1...11)
Sys.print('$i${i == 10 ? '\n' : ', '}');</syntaxhighlight>
Sys.print('$i${i == 10 ? '\n' : ', '}');
</syntaxhighlight>


=={{header|hexiscript}}==
=={{header|hexiscript}}==
<syntaxhighlight lang="hexiscript">for let i 1; i <= 10; i++
<syntaxhighlight lang="hexiscript">
for let i 1; i <= 10; i++
print i
print i
if i = 10; break; endif
if i = 10; break; endif
print ", "
print ", "
endfor
endfor
println ""</syntaxhighlight>
println ""
</syntaxhighlight>


=={{header|HicEst}}==
=={{header|HicEst}}==
<syntaxhighlight lang="hicest">DO i = 1, 10
<syntaxhighlight lang="hicest">
DO i = 1, 10
WRITE(APPend) i
WRITE(APPend) i
IF(i < 10) WRITE(APPend) ", "
IF(i < 10) WRITE(APPend) ", "
ENDDO</syntaxhighlight>
ENDDO
</syntaxhighlight>


=={{header|HolyC}}==
=={{header|HolyC}}==
<syntaxhighlight lang="holyc">U8 i, max = 10;
<syntaxhighlight lang="holyc">
U8 i, max = 10;
for (i = 1; i <= max; i++) {
for (i = 1; i <= max; i++) {
Print("%d", i);
Print("%d", i);
Line 1,766: Line 1,942:
Print(", ");
Print(", ");
}
}
Print("\n");</syntaxhighlight>
Print("\n");
</syntaxhighlight>


=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==
<syntaxhighlight lang="icon">procedure main()
<syntaxhighlight lang="icon">
procedure main()
every writes(i := 1 to 10) do
every writes(i := 1 to 10) do
if i = 10 then break write()
if i = 10 then break write()
else writes(", ")
else writes(", ")
end
end</syntaxhighlight>
</syntaxhighlight>


The above can be written more succinctly as:
The above can be written more succinctly as:
<syntaxhighlight lang="icon">every writes(c := "",1 to 10) do c := ","
<syntaxhighlight lang="icon">
every writes(c := "",1 to 10) do c := ","
</syntaxhighlight>
</syntaxhighlight>


Line 1,783: Line 1,963:
Nobody would ever use a loop in IDL to output a vector of numbers - the requisite output would be generated something like this:
Nobody would ever use a loop in IDL to output a vector of numbers - the requisite output would be generated something like this:


<syntaxhighlight lang="idl">print,indgen(10)+1,format='(10(i,:,","))'</syntaxhighlight>
<syntaxhighlight lang="idl">
print,indgen(10)+1,format='(10(i,:,","))'
</syntaxhighlight>


However if a loop had to be used it could be done like this:
However if a loop had to be used it could be done like this:


<syntaxhighlight lang="idl">for i=1,10 do begin
<syntaxhighlight lang="idl">
for i=1,10 do begin
print,i,format='($,i)'
print,i,format='($,i)'
if i lt 10 then print,",",format='($,a)'
if i lt 10 then print,",",format='($,a)'
endfor</syntaxhighlight>
endfor
</syntaxhighlight>


(which merely suppresses the printing of the comma in the last iteration);
(which merely suppresses the printing of the comma in the last iteration);
Line 1,796: Line 1,980:
or like this:
or like this:


<syntaxhighlight lang="idl">for i=1,10 do begin
<syntaxhighlight lang="idl">
for i=1,10 do begin
print,i,format='($,i)'
print,i,format='($,i)'
if i eq 10 then break
if i eq 10 then break
print,",",format='($,a)'
print,",",format='($,a)'
end
end</syntaxhighlight>
</syntaxhighlight>


(which terminates the loop early if the last element is reached).
(which terminates the loop early if the last element is reached).


=={{header|J}}==
=={{header|J}}==
<syntaxhighlight lang="j">output=: verb define
<syntaxhighlight lang="j">
output=: verb define
buffer=: buffer,y
buffer=: buffer,y
)
)
Line 1,818: Line 2,005:
end.
end.
echo buffer
echo buffer
)
)</syntaxhighlight>
</syntaxhighlight>


Example use:
Example use:
<syntaxhighlight lang="j"> loopy 0
<syntaxhighlight lang="j">
loopy 0
1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


That said, note that neither loops nor output statements are necessary:
That said, note that neither loops nor output statements are necessary:


<syntaxhighlight lang="j"> ;}.,(', ' ; ":)&> 1+i.10
<syntaxhighlight lang="j">
1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
;}.,(', ' ; ":)&> 1+i.10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


And, note also that this sort of data driven approach can also deal with more complex issues:
And, note also that this sort of data driven approach can also deal with more complex issues:


<syntaxhighlight lang="j"> commaAnd=: ":&.> ;@,. -@# {. (<;._1 '/ and /') ,~ (<', ') #~ #
<syntaxhighlight lang="j">
commaAnd=: ":&.> ;@,. -@# {. (<;._1 '/ and /') ,~ (<', ') #~ #
commaAnd i.5
commaAnd i.5
0, 1, 2, 3 and 4</syntaxhighlight>
0, 1, 2, 3 and 4
</syntaxhighlight>


=={{header|Java}}==
=={{header|Java}}==
<syntaxhighlight lang="java">public static void main(String[] args) {
<syntaxhighlight lang="java">
public static void main(String[] args) {
for (int i = 1; ; i++) {
for (int i = 1; ; i++) {
System.out.print(i);
System.out.print(i);
Line 1,844: Line 2,039:
}
}
System.out.println();
System.out.println();
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|JavaScript}}==
=={{header|JavaScript}}==
<syntaxhighlight lang="javascript">function loop_plus_half(start, end) {
<syntaxhighlight lang="javascript">
function loop_plus_half(start, end) {
var str = '',
var str = '',
i;
i;
Line 1,860: Line 2,057:
}
}
alert(loop_plus_half(1, 10));</syntaxhighlight>
alert(loop_plus_half(1, 10));
</syntaxhighlight>


Alternatively, if we stand back for a moment from imperative assumptions about the nature and structure of computing tasks, it becomes clear that the problem of special transitional cases as a pattern terminates has no necessary connection with loops. (See the comments accompanying the ACL2, Haskell, IDL, J and R examples above and below, and see also some of the approaches taken in languages like Clojure and Scala.
Alternatively, if we stand back for a moment from imperative assumptions about the nature and structure of computing tasks, it becomes clear that the problem of special transitional cases as a pattern terminates has no necessary connection with loops. (See the comments accompanying the ACL2, Haskell, IDL, J and R examples above and below, and see also some of the approaches taken in languages like Clojure and Scala.
Line 1,866: Line 2,064:
If a JavaScript expression evaluates to an array [1 .. 10] of integers, for example, we can map that array directly to a comma-delimited string by using the '''Array.join()''' function, writing something like:
If a JavaScript expression evaluates to an array [1 .. 10] of integers, for example, we can map that array directly to a comma-delimited string by using the '''Array.join()''' function, writing something like:


<syntaxhighlight lang="javascript">function range(m, n) {
<syntaxhighlight lang="javascript">
function range(m, n) {
return Array.apply(null, Array(n - m + 1)).map(
return Array.apply(null, Array(n - m + 1)).map(
function (x, i) {
function (x, i) {
Line 1,876: Line 2,075:
console.log(
console.log(
range(1, 10).join(', ')
range(1, 10).join(', ')
);
);</syntaxhighlight>
</syntaxhighlight>


Output:
Output:
<syntaxhighlight lang="javascript">1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
<syntaxhighlight lang="javascript">
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


Otherwise, any special transitional case at the end of a pattern can be handled by defining conditional values for one or more sub-expressions:
Otherwise, any special transitional case at the end of a pattern can be handled by defining conditional values for one or more sub-expressions:


<syntaxhighlight lang="javascript">function range(m, n) {
<syntaxhighlight lang="javascript">
function range(m, n) {
return Array.apply(null, Array(n - m + 1)).map(function (x, i) {
return Array.apply(null, Array(n - m + 1)).map(function (x, i) {
return m + i;
return m + i;
Line 1,903: Line 2,106:
)
)
})(1, 10)
})(1, 10)
);
);</syntaxhighlight>
</syntaxhighlight>


Output:
Output:
<syntaxhighlight lang="javascript">1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
<syntaxhighlight lang="javascript">
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>
==== Otherwise ====
==== Otherwise ====
<syntaxhighlight lang="javascript">var s=1, e=10
<syntaxhighlight lang="javascript">
var s=1, e=10
for (var i=s; i<=e; i+=1) {
for (var i=s; i<=e; i+=1) {
document.write( i==s ? '' : ', ', i )
document.write( i==s ? '' : ', ', i )
}
}</syntaxhighlight>
</syntaxhighlight>
or
or
<syntaxhighlight lang="javascript">var s=1, e=10
<syntaxhighlight lang="javascript">
var s=1, e=10
for (;; s+=1) {
for (;; s+=1) {
document.write( s )
document.write( s )
if (s==e) break
if (s==e) break
document.write( ', ' )
document.write( ', ' )
}
}</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,926: Line 2,136:
=={{header|jq}}==
=={{header|jq}}==
In jq, it is idiomatic to view a range of integers with boundaries m and n as [m, n), i.e. including m but excluding n.
In jq, it is idiomatic to view a range of integers with boundaries m and n as [m, n), i.e. including m but excluding n.
<syntaxhighlight lang="jq">One approach is to construct the answer incrementally:
<syntaxhighlight lang="jq">
One approach is to construct the answer incrementally:
def loop_plus_half(m;n):
def loop_plus_half(m;n):
if m<n then reduce range(m+1;n) as $i (m|tostring; . + ", " + ($i|tostring))
if m<n then reduce range(m+1;n) as $i (m|tostring; . + ", " + ($i|tostring))
Line 1,934: Line 2,145:
# An alternative that is shorter and perhaps closer to the task description because it uses range(m;n) is as follows:
# An alternative that is shorter and perhaps closer to the task description because it uses range(m;n) is as follows:
def loop_plus_half2(m;n):
def loop_plus_half2(m;n):
[range(m;n) | if . == m then . else ", ", . end | tostring] | join("");</syntaxhighlight>
[range(m;n) | if . == m then . else ", ", . end | tostring] | join("");
</syntaxhighlight>
{{Out}}
{{Out}}
loop_plus_half2(1;11)
loop_plus_half2(1;11)
Line 1,954: Line 2,166:


=={{header|K}}==
=={{header|K}}==
<syntaxhighlight lang="k"> p:{`0:$x} / output
<syntaxhighlight lang="k">
p:{`0:$x} / output
i:1;do[10;p[i];p[:[i<10;", "]];i+:1];p@"\n"
i:1;do[10;p[i];p[:[i<10;", "]];i+:1];p@"\n"
1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


Alternative solutions:
Alternative solutions:
<syntaxhighlight lang="k"> 10 {p@x;p@:[x<10;", ";"\n"];x+1}\1;
<syntaxhighlight lang="k">
{p@x;p@:[x<10;", ";"\n"];x+1}'1+!10; /variant</syntaxhighlight>
10 {p@x;p@:[x<10;", ";"\n"];x+1}\1;
{p@x;p@:[x<10;", ";"\n"];x+1}'1+!10; /variant
</syntaxhighlight>


=={{header|Kotlin}}==
=={{header|Kotlin}}==
<syntaxhighlight 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,970: Line 2,187:
if (i < 10) print(", ")
if (i < 10) print(", ")
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


{{out}}
{{out}}
Line 2,022: Line 2,240:


=={{header|Lang5}}==
=={{header|Lang5}}==
<syntaxhighlight lang="lang5">: , dup ", " 2 compress "" join ;
<syntaxhighlight lang="lang5">
: , dup ", " 2 compress "" join ;
1 do dup 10 != if dup , . 1 + else . break then loop</syntaxhighlight>
1 do dup 10 != if dup , . 1 + else . break then loop
</syntaxhighlight>
Word: [[Loops/For#Lang5]]
Word: [[Loops/For#Lang5]]
<syntaxhighlight lang="lang5">: 2string 2 compress "" join ;
<syntaxhighlight lang="lang5">
: 2string 2 compress "" join ;
: , dup 10 != if ", " 2string then ;
: , dup 10 != if ", " 2string then ;
1 10 "dup , . 1+" times</syntaxhighlight>
1 10 "dup , . 1+" times
</syntaxhighlight>


=={{header|Lasso}}==
=={{header|Lasso}}==
<syntaxhighlight lang="lasso">local(out) = ''
<syntaxhighlight lang="lasso">
local(out) = ''
loop(10) => {
loop(10) => {
#out->append(loop_count)
#out->append(loop_count)
Line 2,036: Line 2,259:
#out->append(', ')
#out->append(', ')
}
}
#out
#out</syntaxhighlight>
</syntaxhighlight>


=={{header|Lhogho}}==
=={{header|Lhogho}}==
<code>type</code> doesn't output a newline. The <code>print</code> outputs one.
<code>type</code> doesn't output a newline. The <code>print</code> outputs one.
<syntaxhighlight lang="logo">for "i [1 10]
<syntaxhighlight lang="logo">
for "i [1 10]
[
[
type :i
type :i
Line 2,048: Line 2,273:
]
]
]
]
print</syntaxhighlight>
print
</syntaxhighlight>


A more list-y way of doing it
A more list-y way of doing it


<syntaxhighlight lang="logo">to join :lst :sep
<syntaxhighlight lang="logo">
to join :lst :sep
if list? :lst
if list? :lst
[
[
Line 2,067: Line 2,294:


make "aList [1 2 3 4 5 6 7 8 9 10]
make "aList [1 2 3 4 5 6 7 8 9 10]
print join :aList "|, |</syntaxhighlight>
print join :aList "|, |
</syntaxhighlight>


=={{header|Lisaac}}==
=={{header|Lisaac}}==
<syntaxhighlight lang="lisaac">Section Header
<syntaxhighlight lang="lisaac">
Section Header


+ name := LOOP_AND_HALF;
+ name := LOOP_AND_HALF;
Line 2,088: Line 2,317:
};
};
'\n'.print;
'\n'.print;
);
);</syntaxhighlight>
</syntaxhighlight>


=={{header|LiveCode}}==
=={{header|LiveCode}}==
<syntaxhighlight lang="livecode">repeat with n = 1 to 10
<syntaxhighlight lang="livecode">
repeat with n = 1 to 10
put n after loopn
put n after loopn
if n is not 10 then put comma after loopn
if n is not 10 then put comma after loopn
end repeat
end repeat
put loopn</syntaxhighlight>
put loopn
</syntaxhighlight>


=={{header|Logo}}==
=={{header|Logo}}==
<syntaxhighlight lang="logo">to comma.list :n
<syntaxhighlight lang="logo">
to comma.list :n
repeat :n-1 [type repcount type "|, |]
repeat :n-1 [type repcount type "|, |]
print :n
print :n
end
end


comma.list 10</syntaxhighlight>
comma.list 10
</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==
Translation of C:
Translation of C:
<syntaxhighlight lang="lua">for i = 1, 10 do
<syntaxhighlight lang="lua">
for i = 1, 10 do
io.write(i)
io.write(i)
if i == 10 then break end
if i == 10 then break end
io.write", "
io.write", "
end
end</syntaxhighlight>
</syntaxhighlight>


=={{header|M2000 Interpreter}}==
=={{header|M2000 Interpreter}}==
Line 2,145: Line 2,381:


=={{header|M4}}==
=={{header|M4}}==
<syntaxhighlight lang="m4">define(`break',
<syntaxhighlight lang="m4">
define(`break',
`define(`ulim',llim)')
`define(`ulim',llim)')
define(`for',
define(`for',
Line 2,154: Line 2,391:


for(`x',`1',`',
for(`x',`1',`',
`x`'ifelse(x,10,`break',`, ')')</syntaxhighlight>
`x`'ifelse(x,10,`break',`, ')')
</syntaxhighlight>


=={{header|Make}}==
=={{header|Make}}==
<syntaxhighlight lang="make">NEXT=`expr $* + 1`
<syntaxhighlight lang="make">
NEXT=`expr $* + 1`
MAX=10
MAX=10
RES=1
RES=1
Line 2,167: Line 2,406:


%-n:
%-n:
@-make -f loop.mk $(NEXT)-n MAX=$(MAX) RES=$(RES),$(NEXT)</syntaxhighlight>
@-make -f loop.mk $(NEXT)-n MAX=$(MAX) RES=$(RES),$(NEXT)
</syntaxhighlight>


Invoking it
Invoking it
Line 2,174: Line 2,414:


=={{header|Maple}}==
=={{header|Maple}}==
<syntaxhighlight lang="maple">> for i to 10 do printf( "%d%s", i, `if`( i = 10, "\n", ", " ) ) end:
<syntaxhighlight lang="maple">
> for i to 10 do printf( "%d%s", i, `if`( i = 10, "\n", ", " ) ) end:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


=={{header|Mathematica}}/{{header|Wolfram Language}}==
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">i = 1; s = "";
<syntaxhighlight lang="mathematica">
i = 1; s = "";
While[True,
While[True,
s = s <> ToString@i;
s = s <> ToString@i;
Line 2,185: Line 2,428:
i++;
i++;
]
]
s
s</syntaxhighlight>
</syntaxhighlight>


=={{header|MATLAB}} / {{header|Octave}}==
=={{header|MATLAB}} / {{header|Octave}}==
Vectorized form:
Vectorized form:
<syntaxhighlight lang="matlab"> printf('%i, ',1:9); printf('%i\n',10);</syntaxhighlight>
<syntaxhighlight lang="matlab">
printf('%i, ',1:9); printf('%i\n',10);
</syntaxhighlight>


Explicite loop:
Explicite loop:
<syntaxhighlight lang="matlab"> for k=1:10,
<syntaxhighlight lang="matlab">
for k=1:10,
printf('%i', k);
printf('%i', k);
if k==10, break; end;
if k==10, break; end;
printf(', ');
printf(', ');
end;
end;
printf('\n');</syntaxhighlight>
printf('\n');
</syntaxhighlight>


Output:
Output:
Line 2,203: Line 2,451:


=={{header|MAXScript}}==
=={{header|MAXScript}}==
<syntaxhighlight lang="maxscript">for i in 1 to 10 do
<syntaxhighlight lang="maxscript">
for i in 1 to 10 do
(
(
format "%" i
format "%" i
if i == 10 then exit
if i == 10 then exit
format "%" ", "
format "%" ", "
)
)</syntaxhighlight>
</syntaxhighlight>


=={{header|Metafont}}==
=={{header|Metafont}}==
Line 2,215: Line 2,465:
and then we output it.
and then we output it.


<syntaxhighlight lang="metafont">last := 10;
<syntaxhighlight lang="metafont">
last := 10;
string s; s := "";
string s; s := "";
for i = 1 upto last:
for i = 1 upto last:
Line 2,222: Line 2,473:
endfor
endfor
message s;
message s;
end
end</syntaxhighlight>
</syntaxhighlight>


=={{header|min}}==
=={{header|min}}==
min's <code>linrec</code> combinator is flexible enough to easily accomodate this task, due to taking a quotation to execute at the end of the loop (the second one).
min's <code>linrec</code> combinator is flexible enough to easily accomodate this task, due to taking a quotation to execute at the end of the loop (the second one).
<syntaxhighlight lang="min">1 (dup 10 ==) 'puts! (print succ ", " print!) () linrec</syntaxhighlight>
<syntaxhighlight lang="min">
1 (dup 10 ==) 'puts! (print succ ", " print!) () linrec
</syntaxhighlight>


=={{header|Modula-3}}==
=={{header|Modula-3}}==
<syntaxhighlight lang="modula3">MODULE Loop EXPORTS Main;
<syntaxhighlight lang="modula3">
MODULE Loop EXPORTS Main;


IMPORT IO, Fmt;
IMPORT IO, Fmt;
Line 2,243: Line 2,498:
END;
END;
IO.Put("\n");
IO.Put("\n");
END Loop.</syntaxhighlight>
END Loop.
</syntaxhighlight>


=={{header|MUMPS}}==
=={{header|MUMPS}}==
<syntaxhighlight lang="mumps">LOOPHALF
<syntaxhighlight lang="mumps">
LOOPHALF
NEW I
NEW I
FOR I=1:1:10 DO
FOR I=1:1:10 DO
Line 2,254: Line 2,511:
;Alternate
;Alternate
NEW I FOR I=1:1:10 WRITE I WRITE:I'=10 ", "
NEW I FOR I=1:1:10 WRITE I WRITE:I'=10 ", "
KILL I QUIT</syntaxhighlight>
KILL I QUIT
</syntaxhighlight>
Output:<pre>USER>D LOOPHALF^ROSETTA
Output:<pre>USER>D LOOPHALF^ROSETTA
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Line 2,262: Line 2,520:


=={{header|Nemerle}}==
=={{header|Nemerle}}==
<syntaxhighlight lang="nemerle">foreach (i in [1 .. 10])
<syntaxhighlight lang="nemerle">
foreach (i in [1 .. 10])
{
{
Write(i);
Write(i);
unless (i == 10) Write(", ");
unless (i == 10) Write(", ");
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|NetRexx}}==
=={{header|NetRexx}}==
<syntaxhighlight lang="netrexx">/* NetRexx */
<syntaxhighlight lang="netrexx">
/* NetRexx */
/* NetRexx */
/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
options replace format comments java crossref savelog symbols nobinary
Line 2,285: Line 2,546:
end
end
end i_
end i_
say rs.strip()</syntaxhighlight>
say rs.strip()
</syntaxhighlight>
'''Output'''
'''Output'''
<pre>Loops/N plus one half
<pre>Loops/N plus one half
Line 2,291: Line 2,553:


=={{header|NewLISP}}==
=={{header|NewLISP}}==
<syntaxhighlight lang="newlisp">(for (i 0 10)
<syntaxhighlight lang="newlisp">
(for (i 0 10)
(print i)
(print i)
(unless (= i 10)
(unless (= i 10)
(print ", ")))</syntaxhighlight>
(print ", ")))
</syntaxhighlight>


=={{header|Nim}}==
=={{header|Nim}}==
<syntaxhighlight lang="nim">var s = ""
<syntaxhighlight lang="nim">
var s = ""
for i in 1..10:
for i in 1..10:
s.add $i
s.add $i
if i == 10: break
if i == 10: break
s.add ", "
s.add ", "
echo s</syntaxhighlight>
echo s
</syntaxhighlight>


{{out}}
{{out}}
Line 2,326: Line 2,592:


=={{header|OCaml}}==
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let last = 10 in
<syntaxhighlight lang="ocaml">
let last = 10 in
for i = 1 to last do
for i = 1 to last do
print_int i;
print_int i;
Line 2,332: Line 2,599:
print_string ", ";
print_string ", ";
done;
done;
print_newline();</syntaxhighlight>
print_newline();
</syntaxhighlight>


<syntaxhighlight lang="ocaml">let ints = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] in
<syntaxhighlight lang="ocaml">
let ints = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] in
let str_ints = List.map string_of_int ints in
let str_ints = List.map string_of_int ints in
print_endline (String.concat ", " str_ints);</syntaxhighlight>
print_endline (String.concat ", " str_ints);
</syntaxhighlight>


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


<syntaxhighlight lang="oforth">: loopn
<syntaxhighlight lang="oforth">
: loopn
| i |
| i |
10 loop: i [ i dup print 10 ifEq: [ break ] "," . ] printcr ;</syntaxhighlight>
10 loop: i [ i dup print 10 ifEq: [ break ] "," . ] printcr ;
</syntaxhighlight>


=={{header|Oz}}==
=={{header|Oz}}==
Line 2,351: Line 2,623:
if N == 10 then {Break} end
if N == 10 then {Break} end
{System.printInfo ", "}
{System.printInfo ", "}
end
end</syntaxhighlight>
</syntaxhighlight>


However, it seems more natural to use a left fold:
However, it seems more natural to use a left fold:
<syntaxhighlight lang="oz">declare
<syntaxhighlight lang="oz">
declare
fun {CommaSep Xs}
fun {CommaSep Xs}
case Xs of nil then nil
case Xs of nil then nil
Line 2,364: Line 2,638:
end
end
in
in
{System.showInfo {CommaSep {List.number 1 10 1}}}</syntaxhighlight>
{System.showInfo {CommaSep {List.number 1 10 1}}}
</syntaxhighlight>


=={{header|Panda}}==
=={{header|Panda}}==
Panda is stream based. To know if there is no more values you need to know it's the last. You can only do that if you get all the values. So this is functional style; We accumulate all the values from the stream. Then join them together as strings with a comma.
Panda is stream based. To know if there is no more values you need to know it's the last. You can only do that if you get all the values. So this is functional style; We accumulate all the values from the stream. Then join them together as strings with a comma.
<syntaxhighlight lang="panda">array{{1..10}}.join(',')</syntaxhighlight>
<syntaxhighlight lang="panda">
array{{1..10}}.join(',')
</syntaxhighlight>


=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
<syntaxhighlight lang="parigp">n=0;
<syntaxhighlight lang="parigp">
n=0;
while(1,
while(1,
print1(n++);
print1(n++);
if(n>9, break);
if(n>9, break);
print1(", ")
print1(", ")
);
);</syntaxhighlight>
</syntaxhighlight>


=={{header|Pascal}}==
=={{header|Pascal}}==
<syntaxhighlight lang="pascal">program numlist(output);
<syntaxhighlight lang="pascal">
program numlist(output);


const MAXNUM: integer = 10;
const MAXNUM: integer = 10;
Line 2,398: Line 2,678:
write(i, ', ');
write(i, ', ');
writeln(MAXNUM);
writeln(MAXNUM);
end.
end.</syntaxhighlight>
</syntaxhighlight>


=={{header|Peloton}}==
=={{header|Peloton}}==
<syntaxhighlight lang="sgml"><@ FORLITLIT>10|<@ SAYPOSFOR>...</@><@ ABF>,</@></@></syntaxhighlight>
<syntaxhighlight lang="sgml">
<@ FORLITLIT>10|<@ SAYPOSFOR>...</@><@ ABF>,</@></@>
</syntaxhighlight>


=={{header|Perl}}==
=={{header|Perl}}==
<syntaxhighlight lang="perl">for my $i(1..10) {
<syntaxhighlight lang="perl">
for my $i(1..10) {
print $i;
print $i;
last if $i == 10;
last if $i == 10;
print ', ';
print ', ';
}
}
print "\n";</syntaxhighlight>
print "\n";
</syntaxhighlight>


In perl one would solve the task via <code>join</code>.
In perl one would solve the task via <code>join</code>.
<syntaxhighlight lang="perl">print join(', ', 1..10), "\n";</syntaxhighlight>
<syntaxhighlight lang="perl">
print join(', ', 1..10), "\n";
</syntaxhighlight>


=={{header|Phix}}==
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">-->
<!--<syntaxhighlight lang="phix">
-->
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
Line 2,421: Line 2,709:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--
<!--</syntaxhighlight>-->
</syntaxhighlight>-->


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


10 for dup print 10 == not if ", " print endif endfor</syntaxhighlight>
10 for dup print 10 == not if ", " print endif endfor
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Line 2,433: Line 2,724:


=={{header|PHP}}==
=={{header|PHP}}==
<syntaxhighlight lang="php">for ($i = 1; $i <= 11; $i++) {
<syntaxhighlight lang="php">
for ($i = 1; $i <= 11; $i++) {
echo $i;
echo $i;
if ($i == 10)
if ($i == 10)
Line 2,439: Line 2,731:
echo ', ';
echo ', ';
}
}
echo "\n";</syntaxhighlight>
echo "\n";
</syntaxhighlight>


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==
<syntaxhighlight lang="picolisp">(for N 10
<syntaxhighlight lang="picolisp">
(for N 10
(prin N)
(prin N)
(T (= N 10))
(T (= N 10))
(prin ", ") )</syntaxhighlight>
(prin ", ") )
</syntaxhighlight>


=={{header|Pike}}==
=={{header|Pike}}==
Line 2,458: Line 2,753:
}
}
write("\n");
write("\n");
}
}</syntaxhighlight>
</syntaxhighlight>


The most idiomatic way of inserting delimiters in Pike is the multiplication operator and it's symmetry with division of strings.
The most idiomatic way of inserting delimiters in Pike is the multiplication operator and it's symmetry with division of strings.
<syntaxhighlight lang="text">> "1, 2, 3"/", ";
<syntaxhighlight lang="text">
> "1, 2, 3"/", ";
Result: ({ "1", "2", "3" })
Result: ({ "1", "2", "3" })
> ({ "1", "2", "3" })*", ";
> ({ "1", "2", "3" })*", ";
Result: "1, 2, 3"</syntaxhighlight>
Result: "1, 2, 3"
</syntaxhighlight>


So achieving the result of this task with the method more suited to
So achieving the result of this task with the method more suited to
Pike would be:
Pike would be:
<syntaxhighlight lang="text">array a = (array(string))enumerate(10, 1, 1);
<syntaxhighlight lang="text">
array a = (array(string))enumerate(10, 1, 1);
write(a * ", " + "\n");</syntaxhighlight>
write(a * ", " + "\n");
</syntaxhighlight>


=={{header|PL/I}}==
=={{header|PL/I}}==
Line 2,480: Line 2,780:


=={{header|Plain English}}==
=={{header|Plain English}}==
<syntaxhighlight lang="plainenglish">To run:
<syntaxhighlight lang="plainenglish">
To run:
Start up.
Start up.
Write the numbers up to 10 on the console.
Write the numbers up to 10 on the console.
Line 2,491: Line 2,792:
Write the string on the console without advancing.
Write the string on the console without advancing.
If the counter is less than the number, write ", " on the console without advancing.
If the counter is less than the number, write ", " on the console without advancing.
Repeat.</syntaxhighlight>
Repeat.
</syntaxhighlight>


=={{header|Pop11}}==
=={{header|Pop11}}==
<syntaxhighlight lang="pop11">lvars i;
<syntaxhighlight lang="pop11">
lvars i;
for i from 1 to 10 do
for i from 1 to 10 do
printf(i, '%p');
printf(i, '%p');
Line 2,500: Line 2,803:
printf(', ', '%p');
printf(', ', '%p');
endfor;
endfor;
printf('\n', '%p');</syntaxhighlight>
printf('\n', '%p');
</syntaxhighlight>


=={{header|PowerShell}}==
=={{header|PowerShell}}==
{{trans|C}}
{{trans|C}}
<syntaxhighlight lang="powershell">for ($i = 1; $i -le 10; $i++) {
<syntaxhighlight lang="powershell">
for ($i = 1; $i -le 10; $i++) {
Write-Host -NoNewLine $i
Write-Host -NoNewLine $i
if ($i -eq 10) {
if ($i -eq 10) {
Line 2,511: Line 2,816:
}
}
Write-Host -NoNewLine ", "
Write-Host -NoNewLine ", "
}
}</syntaxhighlight>
</syntaxhighlight>
An interesting alternative solution, although not ''strictly'' a loop, even though <code>switch</code> certainly loops over the given range.
An interesting alternative solution, although not ''strictly'' a loop, even though <code>switch</code> certainly loops over the given range.
<syntaxhighlight lang="powershell">switch (1..10) {
<syntaxhighlight lang="powershell">
switch (1..10) {
{ $true } { Write-Host -NoNewLine $_ }
{ $true } { Write-Host -NoNewLine $_ }
{ $_ -lt 10 } { Write-Host -NoNewLine ", " }
{ $_ -lt 10 } { Write-Host -NoNewLine ", " }
{ $_ -eq 10 } { Write-Host }
{ $_ -eq 10 } { Write-Host }
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Prolog}}==
=={{header|Prolog}}==
<syntaxhighlight lang="prolog">example :-
<syntaxhighlight lang="prolog">
example :-
between(1,10,Val), write(Val), Val<10, write(', '), fail.
between(1,10,Val), write(Val), Val<10, write(', '), fail.
example.</syntaxhighlight>
example.
</syntaxhighlight>
<pre>?- example.
<pre>?- example.
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Line 2,529: Line 2,839:
=={{header|Python}}==
=={{header|Python}}==
The particular pattern and example chosen in the task description is recognised by the Python language and there are more idiomatic ways to achieve the result that don't even require an explicit conditional test such as:
The particular pattern and example chosen in the task description is recognised by the Python language and there are more idiomatic ways to achieve the result that don't even require an explicit conditional test such as:
<syntaxhighlight lang="python">print ( ', '.join(str(i+1) for i in range(10)) )</syntaxhighlight>
<syntaxhighlight lang="python">
print ( ', '.join(str(i+1) for i in range(10)) )
</syntaxhighlight>
But the [http://academicearth.org/lectures/the-loop-and-half-problem named pattern] is shown by code such as the following:
But the [http://academicearth.org/lectures/the-loop-and-half-problem named pattern] is shown by code such as the following:
<syntaxhighlight lang="python">>>> from sys import stdout
<syntaxhighlight lang="python">
>>> from sys import stdout
>>> write = stdout.write
>>> write = stdout.write
>>> n, i = 10, 1
>>> n, i = 10, 1
Line 2,543: Line 2,856:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
>>>
>>></syntaxhighlight>
</syntaxhighlight>


List comprehension one-liner
List comprehension one-liner
Line 2,551: Line 2,865:


{{works with|Python|3.x}}
{{works with|Python|3.x}}
<syntaxhighlight lang="python">n, i = 10, 1
<syntaxhighlight lang="python">
n, i = 10, 1
while True:
while True:
print(i, end="")
print(i, end="")
Line 2,557: Line 2,872:
if i > n:
if i > n:
break
break
print(", ", end="")</syntaxhighlight>
print(", ", end="")
</syntaxhighlight>


=={{header|Quackery}}==
=={{header|Quackery}}==


<syntaxhighlight lang="quackery"> 10 times
<syntaxhighlight lang="quackery">
10 times
[ i^ 1+ echo
[ i^ 1+ echo
i 0 = iff
i 0 = iff
conclude done
conclude done
say ", " ]</syntaxhighlight>
say ", " ]
</syntaxhighlight>


{{out}}
{{out}}
Line 2,573: Line 2,891:
=={{header|R}}==
=={{header|R}}==
The natural way to solve this task in R is:
The natural way to solve this task in R is:
<syntaxhighlight lang="r">paste(1:10, collapse=", ")</syntaxhighlight>
<syntaxhighlight lang="r">
paste(1:10, collapse=", ")
</syntaxhighlight>
The task specifies that we should use a loop however, so this more verbose code is needed.
The task specifies that we should use a loop however, so this more verbose code is needed.
<syntaxhighlight lang="r">for(i in 1:10)
<syntaxhighlight lang="r">
for(i in 1:10)
{
{
cat(i)
cat(i)
Line 2,584: Line 2,905:
}
}
cat(", ")
cat(", ")
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Racket}}==
=={{header|Racket}}==
<syntaxhighlight lang="racket">#lang racket
<syntaxhighlight lang="racket">
#lang racket
(for ((i (in-range 1 15)))
(for ((i (in-range 1 15)))
(display i)
(display i)
#:break (= 10 i)
#:break (= 10 i)
(display ", "))</syntaxhighlight>
(display ", "))
</syntaxhighlight>


Gives the desired output.
Gives the desired output.
Line 2,603: Line 2,927:
}
}


print "\n";</syntaxhighlight>
print "\n";
</syntaxhighlight>


=={{header|REBOL}}==
=={{header|REBOL}}==
<syntaxhighlight lang="rebol">REBOL [
<syntaxhighlight lang="rebol">
REBOL [
Title: "Loop Plus Half"
Title: "Loop Plus Half"
URL: http://rosettacode.org/wiki/Loop/n_plus_one_half
URL: http://rosettacode.org/wiki/Loop/n_plus_one_half
Line 2,616: Line 2,942:
prin ", "
prin ", "
]
]
print ""</syntaxhighlight>
print ""
</syntaxhighlight>


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


repeat i 10 [
repeat i 10 [
Line 2,626: Line 2,954:
prin ", "
prin ", "
]
]
print ""</syntaxhighlight>
print ""
</syntaxhighlight>


=={{header|Relation}}==
=={{header|Relation}}==
Line 2,644: Line 2,973:
=={{header|REXX}}==
=={{header|REXX}}==
===two CHAROUTs===
===two CHAROUTs===
<syntaxhighlight lang="rexx">/*REXX program displays: 1,2,3,4,5,6,7,8,9,10 */
<syntaxhighlight lang="rexx">
/*REXX program displays: 1,2,3,4,5,6,7,8,9,10 */


do j=1 to 10
do j=1 to 10
Line 2,650: Line 2,980:
if j<10 then call charout ,"," /*append a comma for one-digit numbers.*/
if j<10 then call charout ,"," /*append a comma for one-digit numbers.*/
end /*j*/
end /*j*/
/*stick a fork in it, we're all done. */</syntaxhighlight>
/*stick a fork in it, we're all done. */
</syntaxhighlight>
'''output'''
'''output'''
<pre>
<pre>
Line 2,657: Line 2,988:


===one CHAROUT===
===one CHAROUT===
<syntaxhighlight lang="rexx">/*REXX program displays: 1,2,3,4,5,6,7,8,9,10 */
<syntaxhighlight lang="rexx">
/*REXX program displays: 1,2,3,4,5,6,7,8,9,10 */


do j=1 for 10 /*using FOR is faster than TO. */
do j=1 for 10 /*using FOR is faster than TO. */
call charout ,j || left(',',j<10) /*display J, maybe append a comma (,).*/
call charout ,j || left(',',j<10) /*display J, maybe append a comma (,).*/
end /*j*/
end /*j*/
/*stick a fork in it, we're all done. */</syntaxhighlight>
/*stick a fork in it, we're all done. */
</syntaxhighlight>
'''output'''
'''output'''
<pre>
<pre>
Line 2,669: Line 3,002:


===version 3 if the number of items is not known===
===version 3 if the number of items is not known===
<syntaxhighlight lang="rexx">list='aa bb cc dd'
<syntaxhighlight lang="rexx">
list='aa bb cc dd'
sep=', '
sep=', '
Do i=1 By 1 While list<>''
Do i=1 By 1 While list<>''
Line 2,675: Line 3,009:
Parse Var list item list
Parse Var list item list
Call charout ,item
Call charout ,item
End</syntaxhighlight>
End
</syntaxhighlight>
{{out}}
{{out}}
<pre>aa, bb, cc, dd</pre>
<pre>aa, bb, cc, dd</pre>
Line 2,712: Line 3,047:
print ", "
print ", "
end
end
puts
puts</syntaxhighlight>
</syntaxhighlight>
More idiomatic Ruby to obtain the same result is:
More idiomatic Ruby to obtain the same result is:
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
puts (1..10).join(", ")</syntaxhighlight>
puts (1..10).join(", ")
</syntaxhighlight>


=={{header|Rust}}==
=={{header|Rust}}==
Line 2,758: Line 3,095:
part from the bottom to the top of the loop, then NOT include it on the
part from the bottom to the top of the loop, then NOT include it on the
FIRST pass:
FIRST pass:
<syntaxhighlight lang="s-lang">variable more = 0, i;
<syntaxhighlight lang="s-lang">
variable more = 0, i;
foreach i ([1:10]) {
foreach i ([1:10]) {
if (more) () = printf(", ");
if (more) () = printf(", ");
printf("%d", i);
printf("%d", i);
more = 1;
more = 1;
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Salmon}}==
=={{header|Salmon}}==
<syntaxhighlight lang="salmon">iterate (x; [1...10])
<syntaxhighlight lang="salmon">
iterate (x; [1...10])
{
{
print(x);
print(x);
Line 2,773: Line 3,113:
print(", ");
print(", ");
};
};
print("\n");</syntaxhighlight>
print("\n");
</syntaxhighlight>


=={{header|Scala}}==
=={{header|Scala}}==
{{libheader|Scala}}
{{libheader|Scala}}
<syntaxhighlight lang="scala">var i = 1
<syntaxhighlight lang="scala">
var i = 1
while ({
while ({
print(i)
print(i)
Line 2,785: Line 3,127:
i += 1
i += 1
}
}
println()</syntaxhighlight>
println()
<syntaxhighlight lang="scala">println((1 to 10).mkString(", "))</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="scala">
println((1 to 10).mkString(", "))
</syntaxhighlight>


=={{header|Scheme}}==
=={{header|Scheme}}==
It is possible to use continuations:
It is possible to use continuations:
<syntaxhighlight lang="scheme">(call-with-current-continuation
<syntaxhighlight lang="scheme">
(call-with-current-continuation
(lambda (esc)
(lambda (esc)
(do ((i 1 (+ 1 i))) (#f)
(do ((i 1 (+ 1 i))) (#f)
(display i)
(display i)
(if (= i 10) (esc (newline)))
(if (= i 10) (esc (newline)))
(display ", "))))</syntaxhighlight>
(display ", "))))
</syntaxhighlight>


But usually making the tail recursion explicit is enough:
But usually making the tail recursion explicit is enough:
<syntaxhighlight lang="scheme">(let loop ((i 0))
<syntaxhighlight lang="scheme">
(let loop ((i 0))
(display i)
(display i)
(if (= i 10)
(if (= i 10)
Line 2,804: Line 3,152:
(begin
(begin
(display ", ")
(display ", ")
(loop (+ 1 i)))))</syntaxhighlight>
(loop (+ 1 i)))))
</syntaxhighlight>


=={{header|Scilab}}==
=={{header|Scilab}}==
{{works with|Scilab|5.5.1}}
{{works with|Scilab|5.5.1}}
<syntaxhighlight lang="text">for i=1:10
<syntaxhighlight lang="text">
for i=1:10
printf("%2d ",i)
printf("%2d ",i)
if i<10 then printf(", "); end
if i<10 then printf(", "); end
end
end
printf("\n")</syntaxhighlight>
printf("\n")
</syntaxhighlight>
{{out}}
{{out}}
<pre> 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 </pre>
<pre> 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 </pre>


=={{header|Seed7}}==
=={{header|Seed7}}==
<syntaxhighlight 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,830: Line 3,182:
end for;
end for;
writeln;
writeln;
end func;</syntaxhighlight>
end func;
</syntaxhighlight>


=={{header|Sidef}}==
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">for (1..10) { |i|
<syntaxhighlight lang="ruby">
for (1..10) { |i|
print i;
print i;
i == 10 && break;
i == 10 && break;
Line 2,839: Line 3,193:
}
}


print "\n";</syntaxhighlight>
print "\n";
</syntaxhighlight>


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==
<syntaxhighlight lang="smalltalk">1 to: 10 do: [:n |
<syntaxhighlight lang="smalltalk">
1 to: 10 do: [:n |
Transcript show: n asString.
Transcript show: n asString.
n < 10 ifTrue: [ Transcript show: ', ' ]
n < 10 ifTrue: [ Transcript show: ', ' ]
]
]</syntaxhighlight>
</syntaxhighlight>
Smalltalk/X and Pharo/Squeak have special enumeration messages for this in their Collection class, which executes another action in-between iterated elements:
Smalltalk/X and Pharo/Squeak have special enumeration messages for this in their Collection class, which executes another action in-between iterated elements:
{{works with|Smalltalk/X}}{{works with|Pharo}}
{{works with|Smalltalk/X}}{{works with|Pharo}}
<syntaxhighlight lang="smalltalk">(1 to: 10) do: [:n |
<syntaxhighlight lang="smalltalk">
(1 to: 10) do: [:n |
Transcript show: n asString.
Transcript show: n asString.
] separatedBy:[
] separatedBy:[
Transcript show: ', '
Transcript show: ', '
]
]</syntaxhighlight>
</syntaxhighlight>
That is a bit different from the task's specification, but does what is needed here, and is more general in working with any collection (in the above case: a range aka "Interval"). It does not depend on the collection being addressed by an integer index and/or keeping a count inside the loop.
That is a bit different from the task's specification, but does what is needed here, and is more general in working with any collection (in the above case: a range aka "Interval"). It does not depend on the collection being addressed by an integer index and/or keeping a count inside the loop.


Line 2,860: Line 3,219:
line output, and to use the same statement for loop control and the comma.
line output, and to use the same statement for loop control and the comma.


<syntaxhighlight lang="snobol4">loop str = str lt(i,10) (i = i + 1) :f(out)
<syntaxhighlight lang="snobol4">
loop str = str lt(i,10) (i = i + 1) :f(out)
str = str ne(i,10) ',' :s(loop)
str = str ne(i,10) ',' :s(loop)
out output = str
out output = str
end
end</syntaxhighlight>
</syntaxhighlight>


{{works with|Macro Spitbol}}
{{works with|Macro Spitbol}}
Line 2,871: Line 3,232:


This example also breaks the loop explicitly:
This example also breaks the loop explicitly:
<syntaxhighlight lang="snobol4"> output('out',1,'-[-r1]')
<syntaxhighlight lang="snobol4">
output('out',1,'-[-r1]')
loop i = lt(i,10) i + 1 :f(end)
loop i = lt(i,10) i + 1 :f(end)
out = i
out = i
eq(i,10) :s(end)
eq(i,10) :s(end)
out = ',' :(loop)
out = ',' :(loop)
end
end</syntaxhighlight>
</syntaxhighlight>


{{out}}
{{out}}
Line 2,882: Line 3,245:


=={{header|SNUSP}}==
=={{header|SNUSP}}==
<syntaxhighlight lang="snusp">@\>@\>@\>+++++++++<!/+. >-?\# digit and loop test
<syntaxhighlight lang="snusp">
@\>@\>@\>+++++++++<!/+. >-?\# digit and loop test
| | \@@@+@+++++# \>>.<.<</ comma and space
| | \@@@+@+++++# \>>.<.<</ comma and space
| \@@+@@+++++#
| \@@+@@+++++#
\@@@@=++++#</syntaxhighlight>
\@@@@=++++#
</syntaxhighlight>


=={{header|Spin}}==
=={{header|Spin}}==
Line 2,892: Line 3,257:
{{works with|HomeSpun}}
{{works with|HomeSpun}}
{{works with|OpenSpin}}
{{works with|OpenSpin}}
<syntaxhighlight lang="spin">con
<syntaxhighlight lang="spin">
con
_clkmode = xtal1 + pll16x
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
_clkfreq = 80_000_000
Line 2,910: Line 3,276:
waitcnt(_clkfreq + cnt)
waitcnt(_clkfreq + cnt)
ser.stop
ser.stop
cogstop(0)</syntaxhighlight>
cogstop(0)
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,917: Line 3,284:


=={{header|Stata}}==
=={{header|Stata}}==
<syntaxhighlight lang="stata">forv i=1/10 {
<syntaxhighlight lang="stata">
forv i=1/10 {
di `i' _continue
di `i' _continue
if `i'<10 {
if `i'<10 {
Line 2,925: Line 3,293:
di
di
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


=== Mata ===
=== Mata ===
<syntaxhighlight lang="stata">mata
<syntaxhighlight lang="stata">
mata
for (i=1; i<=10; i++) {
for (i=1; i<=10; i++) {
printf("%f",i)
printf("%f",i)
Line 2,937: Line 3,307:
}
}
}
}
end
end</syntaxhighlight>
</syntaxhighlight>


=={{header|Swift}}==
=={{header|Swift}}==
{{works with|Swift|1.x}}
{{works with|Swift|1.x}}
<syntaxhighlight lang="swift">for var i = 1; ; i++ {
<syntaxhighlight lang="swift">
for var i = 1; ; i++ {
print(i)
print(i)
if i == 10 {
if i == 10 {
Line 2,948: Line 3,320:
}
}
print(", ")
print(", ")
}
}</syntaxhighlight>
</syntaxhighlight>
{{works with|Swift|2}} The usual way to do this with Swift 2 is:
{{works with|Swift|2}} The usual way to do this with Swift 2 is:
<syntaxhighlight lang="swift">
<syntaxhighlight lang="swift">
Line 2,957: Line 3,330:
</syntaxhighlight>
</syntaxhighlight>
To satisfy the specification, we have to do something similar to Swift 1.x and other C-like languages:
To satisfy the specification, we have to do something similar to Swift 1.x and other C-like languages:
<syntaxhighlight lang="swift">for var i = 1; ; i++ {
<syntaxhighlight lang="swift">
for var i = 1; ; i++ {
print(i, terminator: "")
print(i, terminator: "")
if i == 10 {
if i == 10 {
Line 2,964: Line 3,338:
}
}
print(", ", terminator: "")
print(", ", terminator: "")
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Tcl}}==
=={{header|Tcl}}==
<syntaxhighlight lang="tcl">for {set i 1; set end 10} true {incr i} {
<syntaxhighlight lang="tcl">
for {set i 1; set end 10} true {incr i} {
puts -nonewline $i
puts -nonewline $i
if {$i >= $end} break
if {$i >= $end} break
puts -nonewline ", "
puts -nonewline ", "
}
}
puts ""</syntaxhighlight>
puts ""
</syntaxhighlight>
However, that's not how the specific task (printing 1..10 with comma separators) would normally be done. (Note, the solution below is ''not'' a solution to the half-looping problem.)
However, that's not how the specific task (printing 1..10 with comma separators) would normally be done. (Note, the solution below is ''not'' a solution to the half-looping problem.)
<syntaxhighlight lang="tcl">proc range {from to} {
<syntaxhighlight lang="tcl">
proc range {from to} {
set result {}
set result {}
for {set i $from} {$i <= $to} {incr i} {
for {set i $from} {$i <= $to} {incr i} {
Line 2,982: Line 3,360:
}
}
puts [join [range 1 10] ", "] ;# ==> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10</syntaxhighlight>
puts [join [range 1 10] ", "] ;# ==> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
</syntaxhighlight>


=={{header|TUSCRIPT}}==
=={{header|TUSCRIPT}}==
Line 3,000: Line 3,379:


=={{header|UNIX Shell}}==
=={{header|UNIX Shell}}==
<syntaxhighlight lang="bash">for(( Z=1; Z<=10; Z++ )); do
<syntaxhighlight lang="bash">
for(( Z=1; Z<=10; Z++ )); do
echo -e "$Z\c"
echo -e "$Z\c"
if (( Z != 10 )); then
if (( Z != 10 )); then
echo -e ", \c"
echo -e ", \c"
fi
fi
done
done</syntaxhighlight>
</syntaxhighlight>


{{works with|Bash}}
{{works with|Bash}}
<syntaxhighlight lang="bash">for ((i=1;i<=$((last=10));i++)); do
<syntaxhighlight lang="bash">
for ((i=1;i<=$((last=10));i++)); do
echo -n $i
echo -n $i
[ $i -eq $last ] && break
[ $i -eq $last ] && break
echo -n ", "
echo -n ", "
done
done</syntaxhighlight>
</syntaxhighlight>


=={{header|UnixPipes}}==
=={{header|UnixPipes}}==
The last iteration is handled automatically for us
The last iteration is handled automatically for us
when there is no element in one of the pipes.
when there is no element in one of the pipes.
<syntaxhighlight lang="bash">yes \ | cat -n | head -n 10 | paste -d\ - <(yes , | head -n 9) | xargs echo</syntaxhighlight>
<syntaxhighlight lang="bash">
yes \ | cat -n | head -n 10 | paste -d\ - <(yes , | head -n 9) | xargs echo
</syntaxhighlight>


=={{header|Ursa}}==
=={{header|Ursa}}==
{{trans|PHP}}
{{trans|PHP}}
<syntaxhighlight lang="ursa">decl int i
<syntaxhighlight lang="ursa">
decl int i
for (set i 1) (< i 11) (inc i)
for (set i 1) (< i 11) (inc i)
out i console
out i console
Line 3,029: Line 3,415:
out ", " console
out ", " console
end for
end for
out endl console</syntaxhighlight>
out endl console
</syntaxhighlight>


=={{header|V}}==
=={{header|V}}==
<syntaxhighlight lang="v">[loop
<syntaxhighlight lang="v">
[loop
[ [10 =] [puts]
[ [10 =] [puts]
[true] [dup put ',' put succ loop]
[true] [dup put ',' put succ loop]
] when].</syntaxhighlight>
] when].
</syntaxhighlight>
Using it
Using it
|1 loop
|1 loop
Line 3,042: Line 3,431:
=={{header|Vala}}==
=={{header|Vala}}==
{{trans|C}}
{{trans|C}}
<syntaxhighlight lang="vala">void main() {
<syntaxhighlight lang="vala">
void main() {
for (int i = 1; i <= 10; i++)
for (int i = 1; i <= 10; i++)
{
{
Line 3,048: Line 3,438:
stdout.printf(i == 10 ? "\n" : ", ");
stdout.printf(i == 10 ? "\n" : ", ");
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Vedit macro language}}==
=={{header|Vedit macro language}}==
This example writes the output into current edit buffer.
This example writes the output into current edit buffer.
<syntaxhighlight lang="vedit">for (#1 = 1; 1; #1++) {
<syntaxhighlight lang="vedit">
for (#1 = 1; 1; #1++) {
Num_Ins(#1, LEFT+NOCR)
Num_Ins(#1, LEFT+NOCR)
if (#1 == 10) { Break }
if (#1 == 10) { Break }
Ins_Text(", ")
Ins_Text(", ")
}
}
Ins_Newline</syntaxhighlight>
Ins_Newline
</syntaxhighlight>


=={{header|Verilog}}==
=={{header|Verilog}}==
<syntaxhighlight lang="Verilog">module main;
<syntaxhighlight lang="Verilog">
module main;
integer i;
integer i;
Line 3,071: Line 3,465:
$finish ;
$finish ;
end
end
endmodule</syntaxhighlight>
endmodule
</syntaxhighlight>
{{out}}
{{out}}
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
<pre>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</pre>
Line 3,077: Line 3,472:


=={{header|Vim Script}}==
=={{header|Vim Script}}==
<syntaxhighlight lang="vim">for i in range(1, 10)
<syntaxhighlight lang="vim">
for i in range(1, 10)
echon i
echon i
if (i != 10)
if (i != 10)
echon ", "
echon ", "
endif
endif
endfor</syntaxhighlight>
endfor
</syntaxhighlight>


=={{header|V (Vlang)}}==
=={{header|V (Vlang)}}==
<syntaxhighlight lang="go">fn main() {
<syntaxhighlight lang="go">
fn main() {
for i := 1; ; i++ {
for i := 1; ; i++ {
print(i)
print(i)
Line 3,093: Line 3,491:
print(", ")
print(", ")
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


=={{header|Wart}}==
=={{header|Wart}}==
<syntaxhighlight lang="wart">for i 1 (i <= 10) ++i
<syntaxhighlight lang="wart">
for i 1 (i <= 10) ++i
pr i
pr i
if (i < 10)
if (i < 10)
pr ", "
pr ", "
(prn)</syntaxhighlight>
(prn)
</syntaxhighlight>


=={{header|Wren}}==
=={{header|Wren}}==
<syntaxhighlight lang="ecmascript">for (i in 1..10) {
<syntaxhighlight lang="ecmascript">
for (i in 1..10) {
System.write(i)
System.write(i)
System.write((i < 10) ? ", " : "\n")
System.write((i < 10) ? ", " : "\n")
}
}</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,113: Line 3,516:


=={{header|XPL0}}==
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">codes CrLf=9, IntOut=11, Text=12;
<syntaxhighlight lang="xpl0">
codes CrLf=9, IntOut=11, Text=12;
int N;
int N;
[for N:= 1 to 10 do \best way to do this
[for N:= 1 to 10 do \best way to do this
Line 3,126: Line 3,530:
];
];
CrLf(0);
CrLf(0);
]
]</syntaxhighlight>
</syntaxhighlight>


=={{header|zkl}}==
=={{header|zkl}}==
<syntaxhighlight lang="zkl">foreach n in ([1..10]){ print(n); if (n!=10) print(",") }</syntaxhighlight>
<syntaxhighlight lang="zkl">
foreach n in ([1..10]){ print(n); if (n!=10) print(",") }
</syntaxhighlight>
Or, using a state machine:
Or, using a state machine:
<syntaxhighlight lang="zkl">[1..10].pump(Console.print, Void.Drop, T(Void.Write,",",Void.Drop));</syntaxhighlight>
<syntaxhighlight lang="zkl">
[1..10].pump(Console.print, Void.Drop, T(Void.Write,",",Void.Drop));
</syntaxhighlight>
where pump is (sink, action, action ...). The first Drop writes the
where pump is (sink, action, action ...). The first Drop writes the
first object from the source (1) to the sink and drops out (and that
first object from the source (1) to the sink and drops out (and that
Line 3,137: Line 3,546:
collects things to write to the sink: a comma and the number, eg ",2".
collects things to write to the sink: a comma and the number, eg ",2".
Or:
Or:
<syntaxhighlight lang="zkl">[1..10].pump(Console.print, Void.Drop, fcn(n){ String(",",n) });</syntaxhighlight>
<syntaxhighlight lang="zkl">
[1..10].pump(Console.print, Void.Drop, fcn(n){ String(",",n) });
</syntaxhighlight>


=={{header|Zig}}==
=={{header|Zig}}==
<syntaxhighlight lang="zig">const std = @import("std");
<syntaxhighlight lang="zig">
const std = @import("std");
pub fn main() !void {
pub fn main() !void {
const stdout_wr = std.io.getStdOut().writer();
const stdout_wr = std.io.getStdOut().writer();
Line 3,152: Line 3,564:
}
}
}
}
}
}</syntaxhighlight>
</syntaxhighlight>


{{omit from|PL/0}}
{{omit from|PL/0}}

Revision as of 11:47, 19 August 2023

Task
Loops/N plus one half
You are encouraged to solve this task according to the task description, using any language you may know.

Quite often one needs loops which, in the last iteration, execute only part of the loop body.

Goal

Demonstrate the best way to do this.

Task

Write a loop which writes the comma-separated list

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

using separate output statements for the number and the comma from within the body of the loop.

Related tasks

11l

L(i) 1..10
   print(i, end' ‘’)
   I !L.last_iteration
      print(‘, ’, end' ‘’)

360 Assembly

*        Loops/N plus one half     13/08/2015
LOOPHALF CSECT         USING  LOOPHALF,R12
         LR     R12,R15
BEGIN    LA     R3,MVC
         SR     R5,R5
         LA     R6,1
         LA     R7,10
LOOPI    BXH    R5,R6,ELOOPI       for i=1 to 10
         XDECO  R5,XDEC
         MVC    0(4,R3),XDEC+8
         LA     R3,4(R3)
         CH     R5,=H'10'
         BNL    NEXTI
         MVC    0(2,R3),=C', '
         LA     R3,2(R3)
NEXTI    B      LOOPI              next i
ELOOPI   XPRNT  MVC,80
         XR     R15,R15
         BR     R14
MVC      DC     CL80' '
XDEC     DS     CL12
         YREGS  
         END    LOOPHALF
Output:
   1,    2,    3,    4,    5,    6,    7,    8,    9,   10

68000 Assembly

Sega Genesis cartridge header and hardware print routines/bitmap font are omitted here but do work as intended.

	moveq #0,d0
	move.w #1,d1		;ABCD can't use an immediate operand
	move.w #10-1,d2
loop:
	abcd d1,d0
	move.l d0,-(sp)
		jsr printhex
	move.l (sp)+,d0
	cmp.b #$10,d0		;we use hex 10 since this is binary-coded decimal
	beq exitEarly
	move.l d0,-(sp)
		move.b #',',D0	;PrintChar uses D0 as input
		jsr PrintChar
		move.b #' ',D0  
		jsr PrintChar
	move.l (sp)+,d0	
	DBRA d2,loop
	
exitEarly:
	
	
	; include "X:\SrcGEN\testModule.asm"
	
	jmp *
Output:
01, 02, 03, 04, 05, 06, 07, 08, 09, 10

8086 Assembly

Since the output of the last element is different than the rest, the easiest way to accomplish this is by "breaking out" of the loop with a comparison to 10.

    .model small
    .stack 1024

    .data   ;no data needed
     
    .code
	
start:
	mov ax,0000h	
	mov cx,0FFFFh	;this value doesn't matter as long as it's greater than decimal 10.
	
repeatPrinting:
	add ax,1 ;it was easier to start at zero and add here than to start at 1 and add after printing.
	aaa	 ;ascii adjust for addition, corrects 0009h+1 from 000Ah to 0100h
	call PrintBCD_IgnoreLeadingZeroes
	cmp ax,0100h		;does AX = BCD 10?
	je exitLoopEarly	;if so, we're done now. Don't finish the loop.
	push ax
		mov dl,","       ;print a comma
		mov ah,02h
		int 21h        
		
		mov dl,20h	;print a blank space
		mov ah,02h
		int 21h
	pop ax
	loop repeatPrinting
exitLoopEarly:
	mov ax,4C00h
	int 21h			;return to DOS

PrintBCD_IgnoreLeadingZeroes:
	push ax
		cmp ah,0
		jz skipLeadingZero
			or ah,30h                      ;converts a binary-coded-decimal value to an ASCII numeral
			push dx
			push ax
				mov al,ah
				mov ah,0Eh
				int 10h			;prints AL to screeen
			pop ax
			pop dx
skipLeadingZero:
		or al,30h
		push dx
		push ax
			mov ah,0Eh
			int 10h				;prints AL to screen
		pop ax
		pop dx
	pop ax
	ret
        end start ;EOF
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program loopnplusone64.s   */
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessResult:      .asciz "@"             // message result
szMessComma:       .asciz ", "
szCarriageReturn:  .asciz "\n"
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss 
sZoneConv:              .skip 24
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                                     // entry of program 
    mov x20,1                             // loop counter
1:                                        // begin loop 
    mov x0,x20
    ldr x1,qAdrsZoneConv                  // display value
    bl conversion10                       // decimal conversion
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv                  // display value
    bl strInsertAtCharInc                 // insert result at @ character
    bl affichageMess                      // display message
    ldr x0,qAdrszMessComma
    bl affichageMess                      // display comma
    add x20,x20,1                             // increment counter
    cmp x20,10                            // end ?
    blt 1b                                // no ->begin loop one
    mov x0,x20
    ldr x1,qAdrsZoneConv                  // display value
    bl conversion10                       // decimal conversion
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv                  // display value
    bl strInsertAtCharInc                 // insert result at @ character
    bl affichageMess                      // display message
    ldr x0,qAdrszCarriageReturn
    bl affichageMess                      // display return line
 
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
qAdrszMessComma:          .quad szMessComma
qAdrszCarriageReturn:     .quad szCarriageReturn

/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

ACL2

ACL2 does not have loops, but this is close:

(defun print-list (xs)
   (progn$ (cw "~x0" (first xs))
           (if (endp (rest xs))
               (cw (coerce '(#\Newline) 'string))
               (progn$ (cw ", ")
                       (print-list (rest xs))))))

Action!

PROC Main()
  BYTE i=[1]
  
  DO
    PrintB(i)
    IF i=10 THEN
      EXIT
    FI
    Print(", ")
    i==+1
  OD
RETURN
Output:

Screenshot from Atari 8-bit computer

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Ada

with Ada.Text_IO;

procedure LoopsAndHalf is 
begin
  for i in 1 .. 10 loop
    Ada.Text_IO.put (i'Img);
    exit when i = 10;
    Ada.Text_IO.put (",");
  end loop;
  Ada.Text_IO.new_line;
end LoopsAndHalf;

Aime

integer i;

i = 0;
while (1) {
    i += 1;
    o_integer(i);
    if (i == 10) {
        break;
    }
    o_text(", ");
}
o_text("\n");

ALGOL 60

Works with: ALGOL 60 version OS/360
'BEGIN'
  'COMMENT' Loops N plus one half - Algol60 - 20/06/2018;
  'INTEGER' I;
  'FOR' I:=1 'STEP' 1 'UNTIL' 10 'DO' 'BEGIN'
    OUTINTEGER(1,I);
    'IF' I 'NOTEQUAL' 10 'THEN' OUTSTRING(1,'(', ')')
  'END'
'END'
Output:
         +1  ,          +2  ,          +3  ,          +4  ,          +5  ,          +6  ,          +7  ,          +8  ,         +9  ,         +10

ALGOL 68

Works with: ALGOL 68 version Standard - no extensions to language used
Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386
Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386

There are three common ways of achieving n+½ loops:

  FOR i WHILE
    print(whole(i, -2));
# WHILE # i < 10 DO
    print(", ")

  OD;

  print(new line)
FOR i TO 10 DO
  print(whole(i, -2));
  IF i < 10 THEN
    print(", ")
  FI
OD;

print(new line)
FOR i DO
  print(whole(i, -2));
  IF i >= 10 THEN GO TO done FI;
  print(", ")

OD;
done:
print(new line)

Output for all cases above:

 1,  2,  3,  4,  5,  6,  7,  8,  9, 10

ALGOL W

begin
    integer i;
    i := 0;
    while
        begin
           i := i + 1;
           writeon( i );
           i < 10
        end
    do
    begin
       writeon( "," )
    end
end.

AmigaE

PROC main()
  DEF i
  FOR i := 1 TO 10
    WriteF('\d', i)
    EXIT i = 10
    WriteF(', ')
  ENDFOR
ENDPROC

ARM Assembly

Works with: as version Raspberry Pi
/* ARM assembly Raspberry PI  */
/*  program loopnplusone.s   */

/* Constantes    */
.equ STDOUT, 1     @ Linux output console
.equ EXIT,   1     @ Linux syscall
.equ WRITE,  4     @ Linux syscall

/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessResult:      .ascii ""                    @ message result
sMessValeur:       .fill 11, 1, ' '
szMessComma:       .asciz ","
szCarriageReturn:  .asciz "\n"
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss 
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                                       @ entry of program 
    mov r4,#1                               @ loop counter
1:                                          @ begin loop 
    mov r0,r4
    ldr r1,iAdrsMessValeur                  @ display value
    bl conversion10                         @ decimal conversion
    ldr r0,iAdrszMessResult
    bl affichageMess                        @ display message
    ldr r0,iAdrszMessComma
    bl affichageMess                        @ display comma
    add r4,#1                               @ increment counter
    cmp r4,#10                              @ end ?
    blt 1b                                  @ no ->begin loop one
    mov r0,r4
    ldr r1,iAdrsMessValeur                  @ display value
    bl conversion10                         @ decimal conversion
    ldr r0,iAdrszMessResult
    bl affichageMess                        @ display message
    ldr r0,iAdrszCarriageReturn
    bl affichageMess                        @ display return line

100:                                        @ standard end of the program 
    mov r0, #0                              @ return code
    mov r7, #EXIT                           @ request to exit program
    svc #0                                  @ perform the system call

iAdrsMessValeur:          .int sMessValeur
iAdrszMessResult:         .int szMessResult
iAdrszMessComma:          .int szMessComma
iAdrszCarriageReturn:     .int szCarriageReturn
/******************************************************************/
/*     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 registers */ 
    bx lr                                   @ return  
/******************************************************************/
/*     Converting a register to a decimal                                 */ 
/******************************************************************/
/* r0 contains value and r1 address area   */
.equ LGZONECAL,   10
conversion10:
    push {r1-r4,lr}                         @ save registers 
    mov r3,r1
    mov r2,#LGZONECAL

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
                                            @ end replaces digit in front of area
    mov r4,#0
2:
    ldrb r1,[r3,r2] 
    strb r1,[r3,r4]                         @ store in area begin
    add r4,#1
    add r2,#1                               @ previous position
    cmp r2,#LGZONECAL                       @ end
    ble 2b                                  @ loop
    mov r1,#0                               @ final zero 
    strb r1,[r3,r4]
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                                  @ return

ArnoldC

IT'S SHOWTIME
HEY CHRISTMAS TREE n
YOU SET US UP @NO PROBLEMO
HEY CHRISTMAS TREE lessThanTen
YOU SET US UP @NO PROBLEMO
STICK AROUND lessThanTen
TALK TO THE HAND n
GET TO THE CHOPPER lessThanTen
HERE IS MY INVITATION 10
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE lessThanTen
TALK TO THE HAND ", "
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER n
HERE IS MY INVITATION n
GET UP @NO PROBLEMO
ENOUGH TALK
CHILL
YOU HAVE BEEN TERMINATED

Arturo

print join.with:", " map 1..10 => [to :string]
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Asymptote

for(int i = 1; i <= 10; ++i) {
  write(i, suffix=none); 
  if(i < 10)  write(", ", suffix=none);
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

AutoHotkey

Loop, 9                ; loop 9 times
{
  output .= A_Index    ; append the index of the current loop to the output var
  If (A_Index <> 9)    ; if it isn't the 9th iteration of the loop
    output .= ", "     ; append ", " to the output var
}
MsgBox, %output%

AutoIt

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author:         Alexander Alvonellos

 Script Function:
	Output a comma separated list from 1 to 10, and on the tenth iteration of the
	output loop, only perform half of the loop.

#ce ----------------------------------------------------------------------------

Func doLoopIterative()
		Dim $list = ""
		For $i = 1 To 10 Step 1
			$list = $list & $i
			If($i = 10) Then ExitLoop
			$list = $list & ", "
		Next
		return $list & @CRLF
EndFunc

Func main()
	ConsoleWrite(doLoopIterative())
EndFunc

main()

AWK

One-liner:

$ awk 'BEGIN{for(i=1;i<=10;i++){printf i;if(i<10)printf ", "};print}'
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Readable version:

BEGIN {
  n=10
  for(i=1;i<=n;i++) {
    printf i; 
    if(i<n) printf ", "
  }
  print
}

Same output.

Axe

For(I,1,10)
 Disp I▶Dec
 If I=10
  Disp i
 Else
  Disp ","
 End
End

BASIC

Works with: FreeBASIC
Works with: QBasic version 1.1
Works with: QuickBasic version 4.5
Works with: RapidQ
DIM i AS Integer

FOR i=1 TO 10
    PRINT USING "##"; i;
    IF i=10 THEN EXIT FOR
    PRINT ", ";
NEXT i

Applesoft BASIC

Works with: Commodore BASIC

The ZX Spectrum Basic code will work just fine in Applesoft BASIC. The following is a more structured approach which avoids the use of GOTO.

10 FOR I = 1 TO 10
20     PRINT I;
30     IF I < 10 THEN PRINT ", "; : NEXT I

ASIC

If equality checking affect the efficiency or if the last value were treated in different manner, one can extract the last iteration.

ASIC prints integer numbers as six-char strings. If shorter ones are needed, one can use the STR$ and LTRIM$ functions.

REM Loops/N plus one half
FOR I = 1 TO 9
  PRINT I; 
  PRINT ",";
NEXT I
PRINT 10
END
Output:
     1,     2,     3,     4,     5,     6,     7,     8,     9,    10

Basic09

PROCEDURE nAndAHalf
   DIM i:INTEGER
   FOR i:=1 TO 10
      PRINT i;
   EXITIF i=10 THEN ENDEXIT
      PRINT ", ";
   NEXT i
   PRINT

BASIC256

for i = 1 to 10
	print i;
	if i < 10 then print ", ";
next i

end

BBC BASIC

      FOR i% = 1 TO 10
        PRINT ; i% ;
        IF i% <> 10 PRINT ", ";
      NEXT
      PRINT

Chipmunk Basic

Works with: Chipmunk Basic version 3.6.4
10 rem Loops/N plus one half
20 c$ = ""
30 for i = 1 to 10
40  print c$;str$(i);
50  c$ = ", "
60 next i

FBSL

#APPTYPE CONSOLE
For Dim i = 1 To 10
    PRINT i;
    IF i < 10 THEN PRINT ", ";
Next
PAUSE

Output

1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Press any key to continue...

FreeBASIC

' FB 1.05.0 Win64

For i As Integer = 1 To 10
  Print Str(i);
  If i < 10 Then Print ", ";
Next

Print  
Sleep
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Alternative

This makes the important point that for many loops of this kind the partial iteration could easily be the first one.

dim as string cm = ""
for i as ubyte = 1 to 10
    print cm;str(i);
    cm = ", "
next i

FutureBasic

window 1

long i, num = 10

for i = 1 to num
  print i;
  if i = num then break
  print @", ";
next i

HandleEvents
Output:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Gambas

Click this link to run this code

Public Sub Main()
Dim siLoop As Short

For siLoop = 1 To 10
  Print siLoop;
  If siLoop <> 10 Then Print ", ";
Next

End
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

GW-BASIC

10 C$ = ""
20 FOR I = 1 TO 10
30 PRINT C$;STR$(I);
40 C$=", "
50 NEXT I

IS-BASIC

100 FOR I=1 TO 10
110   PRINT I;
120   IF I=10 THEN EXIT FOR
130   PRINT ",";
140 NEXT

Liberty BASIC

Works with: Just BASIC

Keyword 'exit' allows the termination.

for i =1 to 10
    print i;
    if i =10 then exit for
    print ", ";
next i
end

Microsoft Small Basic

For i = 1 To 10
  TextWindow.Write(i)
  If i <> 10 Then
    TextWindow.Write(", ")
  EndIf
EndFor 
TextWindow.WriteLine("")

NS-HUBASIC

10 FOR I=1 TO 10
20 PRINT I;
30 IF I=10 THEN GOTO 50
40 PRINT ",";
50 NEXT

PureBasic

x=1
Repeat 
  Print(Str(x))
  x+1
  If x>10: Break: EndIf
  Print(", ")
ForEver

QBasic

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5
FOR i = 1 TO 10
    PRINT USING "##"; i;
    IF i=10 THEN EXIT FOR
    PRINT ", ";
NEXT i

Run BASIC

FOR i = 1 TO 10
  PRINT cma$;i;
  cma$ = ", "
NEXT i

Sinclair ZX81 BASIC

The ZX Spectrum Basic program will work on the ZX81. Depending on the context, the programmer's intention may be clearer if we do it all with GOTOs instead of a FOR loop.

10 LET I=1
20 PRINT I;
30 IF I=10 THEN GOTO 70
40 PRINT ", ";
50 LET I=I+1
60 GOTO 20

TI-89 BASIC

There is no horizontal cursor position on the program IO screen, so we concatenate strings instead.

Local str
"" → str
For i,1,10
  str & string(i) → str
  If i < 10 Then
    str & "," → str
  EndIf
EndFor
Disp str

Tiny BASIC

Tiny BASIC does not support string concatenation so each number is on a separate line but this is at least in the spirit of the task description.

    LET I = 1
 10 IF I = 10 THEN PRINT I
    IF I < 10 THEN PRINT I,", "
    IF I = 10 THEN END
    LET I = I + 1
    GOTO 10

A solution for the dialects of Tiny BASIC that support string concatenation.

Works with: TinyBasic
10 REM Loops/N plus one half
20 LET I = 1
30 IF I = 10 THEN PRINT I
40 IF I < 10 THEN PRINT I; ", ";
50 IF I = 10 THEN END
60 LET I = I + 1
70 GOTO 30
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

True BASIC

Works with: QBasic
LET cm$ = ""
FOR i = 1 to 10
    PRINT cm$; str$(i);
    LET cm$ = ", "
NEXT i
END

VBA

Public Sub WriteACommaSeparatedList()
    Dim i As Integer
    Dim a(1 To 10) As String
    For i = 1 To 10
        a(i) = CStr(i)
    Next i
    Debug.Print Join(a, ", ")
End Sub

Visual Basic .NET

For i = 1 To 10
    Console.Write(i)
    If i = 10 Then Exit For
    Console.Write(", ")
Next

Wee Basic

print 1 "" ensures the end of program text is separate from the list of numbers.

print 1 ""
for numbers=1 to 10
print 1 at numbers*3-2,0 numbers
if numbers<>10
print 1 at numbers*3-1,0 ","
endif
end

XBasic

Works with: Windows XBasic
PROGRAM "n_plus_one_half"

DECLARE FUNCTION Entry()

FUNCTION Entry()
  FOR i% = 1 TO 10
    PRINT i%;
    IF i% = 10 THEN EXIT FOR
    PRINT ",";
  NEXT i%
END FUNCTION
END PROGRAM
Output:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

If equality checking affect the efficiency or if the last value were treated in different manner, one can extract the last iteration.

Works with: Windows XBasic
PROGRAM "n_plus_one_half"

DECLARE FUNCTION Entry()

FUNCTION Entry()
  FOR i% = 1 TO 9
    PRINT i%; ",";
  NEXT i%
  PRINT 10
END FUNCTION
END PROGRAM
Output:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Yabasic

for i = 1 to 10
  print i;
  if i < 10  print ", ";
next i
print  
end

ZX Spectrum Basic

Works with: Applesoft BASIC
Works with: Commodore BASIC

To terminate a loop on the ZX Spectrum, set the loop counter to a value that will exit the loop, before jumping to the NEXT statement.

10 FOR i=1 TO 10
20 PRINT i;
30 IF i=10 THEN GOTO 50
40 PRINT ", ";
50 NEXT i

bc

Works with: GNU bc

The print extension is necessary to get the required output.

while (1) {
    print ++i
    if (i == 10) {
        print "\n" 
        break
    }
    print ", "
}

Befunge

1+>::.9`#@_" ,",,

This code is a good answer. However, most Befunge implementations print a " " after using . (output number), so this program prints "1 , 2 , 3 ..." with extra spaces. A bypass for this is possible, by adding 48 and printing the ascii character, but does not work with 10::

1+>::68*+,8`#v_" ,",,
  @,,,,", 10"<

Bracmat

  1:?i
&   whl
  ' ( put$!i
    & !i+1:~>10:?i
    & put$", "
    )

C

Translation of: C++
#include <stdio.h>

int main()
{
  int i;
  for (i = 1; i <= 10; i++) {
    printf("%d", i);
    printf(i == 10 ? "\n" : ", ");
  }
  return 0;
}

C#

using System;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 1; ; i++)
        {
            Console.Write(i);
            if (i == 10) break;
            Console.Write(", ");
        }
        Console.WriteLine();
    }
}

C++

#include <iostream>
 
int main()
{ 
  int i;
  for (i = 1; i<=10 ; i++){
    std::cout << i;
    if (i < 10)
     std::cout << ", ";
  }
  return 0;
}

Chapel

for i in 1..10 do
        write(i, if i % 10 > 0 then ", " else "\n")

Clojure

; Functional version
(apply str (interpose ", " (range 1 11)))

; Imperative version
(loop [n 1]
   (printf "%d" n)
   (if (< n 10)
       (do
	(print ", ")
	(recur (inc n)))))

COBOL

Works with: OpenCOBOL
       IDENTIFICATION DIVISION.
       PROGRAM-ID. Loop-N-And-Half.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  I    PIC 99.
       01  List PIC X(45).

       PROCEDURE DIVISION.
           PERFORM FOREVER
               *> The list to display must be built up because using
               *> DISPLAY adds an endline at the end automatically.
               STRING FUNCTION TRIM(List) " "  I  INTO List

               IF I = 10
                   EXIT PERFORM
               END-IF
               
               STRING FUNCTION TRIM(List) "," INTO List

               ADD 1 TO I
           END-PERFORM

           DISPLAY List

           GOBACK
           .

Free-form, 'List'-free version, using DISPLAY NO ADVANCING.

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  I    PIC 99 VALUE 1.
01	IDISP	PIC Z9.
PROCEDURE DIVISION.
	PERFORM FOREVER
		MOVE I TO IDISP
		DISPLAY FUNCTION TRIM(IDISP) WITH NO ADVANCING
		IF I = 10
			EXIT PERFORM
		END-IF
		DISPLAY ", " WITH NO ADVANCING
		ADD 1 TO I
	END-PERFORM.
	STOP RUN.
	END-PROGRAM.

Free-form, GO TO, 88-level. Paragraphs in PROCEDURE DIVISION.

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV-GOTO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  I	PIC 99	VALUE 1.
	88	END-LIST	VALUE 10.
01	I-OUT	PIC Z9.
PROCEDURE DIVISION.
01-LOOP.
	MOVE I TO I-OUT.
	DISPLAY FUNCTION TRIM(I-OUT) WITH NO ADVANCING.
	IF END-LIST GO TO 02-DONE.
	DISPLAY ", " WITH NO ADVANCING.
	ADD 1 TO I.
	GO TO 01-LOOP.
02-DONE.
	STOP RUN.
	END-PROGRAM.

Using 'PERFORM VARYING'

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-1p5-NOADV-VARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  I    	PIC 99  VALUE 1.
	88	END-LIST	VALUE 10.
01	I-OUT	PIC Z9.
PROCEDURE DIVISION.
	PERFORM WITH TEST AFTER VARYING I FROM 1 BY 1 UNTIL END-LIST 
		MOVE I TO I-OUT
		DISPLAY FUNCTION TRIM(I-OUT) WITH NO ADVANCING
		IF NOT END-LIST
			DISPLAY ", " WITH NO ADVANCING
		END-IF
	END-PERFORM.
	STOP RUN.
	END-PROGRAM.

CoffeeScript

# Loop plus half.  This code shows how to break out of a loop early
# on the last iteration.  For the contrived example, there are better
# ways to generate a comma-separated list, of course.
start = 1
end = 10
s = ''
for i in [start..end]
  # the top half of the loop executes every time
  s += i
  break if i == end
  # the bottom half of the loop is skipped for the last value
  s += ', '
console.log s

ColdFusion

With tags:

<cfloop index = "i" from = "1" to = "10">
  #i#
  <cfif i EQ 10>
    <cfbreak />
  </cfif>
  , 
</cfloop>

With script:

<cfscript>
  for( i = 1; i <= 10; i++ ) //note: the ++ notation works only on version 8 up, otherwise use i=i+1
  {
    writeOutput( i );
    
    if( i == 10 )
    {
      break;
    }
    writeOutput( ", " );
  }
</cfscript>

Common Lisp

(loop for i from 1 below 10 do 
        (princ i) (princ ", ")
        finally (princ i))

or

(loop for i from 1 upto 10 do
  (princ i)
  (if (= i 10) (return))
  (princ ", "))

but for such simple tasks we can use format's powers:

(format t "~{~a~^, ~}" (loop for i from 1 to 10 collect i))

Using DO

(do ((i 1 (incf i)))			; Initialize to 1 and increment on every loop
    ((> i 10))				; Break condition
  (princ i)				; Print the iteration number
  (when (= i 10) (go end))		; Use the implicit tagbody and go to end tag when reach the last iteration
  (princ ", ")				; Printing the comma is jumped by the go statement
 end)					; The tag

or

(do	                                ; Not exactly separate statements for the number and the comma
 ((i 1 (incf i)))	                ; Initialize to 1 and increment on every loop
 ((> i 9) (princ i))                    ; Break condition when iteration is the last number, print it
  (princ i)	                        ; Print number statement
  (princ ", "))	                        ; Print comma statement
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Cowgol

include "cowgol.coh";

var i: uint8 := 1;
loop    
    print_i8(i);
    if i == 10 then break; end if;
    print(", ");
    i := i + 1;
end loop;
print_nl();
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

D

Iterative

import std.stdio;
 
void main() {
    for (int i = 1; ; i++) {
        write(i);
        if (i >= 10)
            break;
        write(", ");
    }

    writeln();
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Functional Style

void main() {
    import std.stdio, std.range, std.algorithm, std.conv, std.string;
    iota(1, 11).map!text.join(", ").writeln;

    // A simpler solution:
    writefln("%(%d, %)", iota(1, 11));
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Dart

String loopPlusHalf(start, end) {
  var result = '';
  for(int i = start; i <= end; i++) {
    result += '$i';
    if(i == end) {
      break;
    }
    result += ', ';
  }
  return result;
}

void main() {
  print(loopPlusHalf(1, 10));
}

Delphi

program LoopsNPlusOneHalf;

{$APPTYPE CONSOLE}

var
  i: integer;
const
  MAXVAL = 10;
begin
  for i := 1 to MAXVAL do
  begin
    Write(i);
    if i < MAXVAL then
      Write(', ');
  end;
  Writeln;
end.

Draco

proc nonrec main() void:
    byte i;
    i := 1;
    while
        write(i);
        i := i + 1;
        i <= 10
    do  
        write(", ")
    od
corp
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

DWScript

var i : Integer;

for i := 1 to 10 do begin
   Print(i);
   if i < 10 then
      Print(', ');
end;

E

A typical loop+break solution:

var i := 1
while (true) {
    print(i)
    if (i >= 10) { break }
    print(", ")
    i += 1
}

Using the loop primitive in a semi-functional style:

var i := 1
__loop(fn {
    print(i)
    if (i >= 10) {
        false
    } else {
        print(", ")
        i += 1
        true 
    }
})

EasyLang

for i = 1 to 10
   write i
   if i < 10
      write ", "
   .
.

EchoLisp

(string-delimiter "")

(for ((i (in-range 1 11))) (write i) #:break (= i 10) (write ","))
  1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 

;; or

(string-join (range 1 11) ",")
    1,2,3,4,5,6,7,8,9,10

EDSAC order code

[ N and a half times loop
  =======================

  A program for the EDSAC

  Works with Initial Orders 2 ]

        T56K
        GK

        O16@
[  1 ]  T24@
        A25@
        A18@
        U25@
        S23@
        E11@

        O25@
        O19@
        O20@
        G1@

[ 11 ]  O18@
        O17@
        O21@
        O22@
        ZF

[ 16 ]  #F
[ 17 ]  PF
[ 18 ]  QF
[ 19 ]  NF
[ 20 ]  !F
[ 21 ]  @F
[ 22 ]  &F
[ 23 ]  JF
[ 24 ]  PF
[ 25 ]  PF

        EZPF
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Alternative

In the original EDSAC solution, the last number is printed outside the loop. My understanding of the task is that all numbers should be printed inside the loop, and control should then pass out of the loop without printing a comma after the last number.

To avoid dragging in a number-printing subroutine just to print 10, the output from the subroutines below has been changed to the single digits 0..9.

The first subroutine sticks to the task description: "in the last iteration, execute only part of the loop body". Two conditional jumps are encountered each time round the loop. The second subroutine skips the first part of the first iteration. This may not exactly fit the task description, but it has the advantage of requiring only one conditional jump within the loop. Cf. the S-lang solution and the comment by its author.

[Loop-and-a-half for Rosetta Code.
 EDSAC program, Initial Orders 2.]
          T64K      [load at location 64 (arbitrary choice)]
          GK        [set @ (theta) parameter]
[Constants]
    [0]   OF        [digit 9]
    [1]   JF        [to inc digit after subtracting 9]
    [2]   #F        [figures mode]
    [3]   !F        [space]
    [4]   NF        [comma (in figures mode)]
    [5]   @F        [carriage return]
    [6]   &F        [line feed]
[Variable]
    [7]   PF        [current digit]

[First subroutine to print digits 0..9]
    [8]   A3F T20@  [plant return link as usual]
          T7@       [digit := 0]
   [11]   O7@       [loop: print digit]
          A7@ S@    [is digit 9?]
          E20@      [if so, jump to exit]
          O4@ O3@   [print comma and space]
          A1@       [inc digit in acc]
          T7@       [update digit in store]
          E11@      [always loop back]
   [20]   ZF        [(planted) return to caller with acc = 0]

[Second subroutine to print digits 0..9
 Instead of saying "print a comma after each digit except the last"
   it says "print a comma before each digit except the first".]
   [21]   A3F T33@  [plant return link as usual]
          T7@       [digit := 0]
          E29@      [jump into middle of loop]
   [25]   A1@       [loop: inc digit in acc]
          T7@       [update digit in store]
          O4@ O3@   [print comma and space]
   [29]   O7@       [print digit]
          A7@ S@    [is digit 9?]
          G25@      [if not, loop back]
   [33]   ZF        [(planted) return to caller with acc = 0]

[Enter with acc = 0]
   [34]   O2@       [set teleprinter to figures]
          A35@ G8@  [call first subroutine]
          O5@ O6@   [print CR, LF]
          A39@ G21@ [call second subroutine]
          O5@ O6@   [print CR, LF]
          O2@       [print dummy character to flush teleprinter buffer]
          ZF        [stop]
          E34Z      [define entry point]
          PF        [value of acc on entry (here = 0)]
[end]
Output:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Elixir

defmodule Loops do
  def n_plus_one_half([]), do: IO.puts ""
  def n_plus_one_half([x]), do: IO.puts x
  def n_plus_one_half([h|t]) do
    IO.write "#{h}, "
    n_plus_one_half(t)
  end
end

Enum.to_list(1..10) |> Loops.n_plus_one_half

Erlang

%% Implemented by Arjun Sunel
-module(loop).
-export([main/0]).
 
main() ->
	for_loop(1).    
 
 for_loop(N) ->
 	if N < 10 ->
		io:format("~p, ",[N] ),
		for_loop(N+1);
	true ->
		io:format("~p\n",[N])
	end.

ERRE

FOR I=1 TO 10 DO
    PRINT(I;)
    EXIT IF I=10
    PRINT(", ";)
END FOR

Euphoria

for i = 1 to 10 do
    printf(1, "%g", {i})
    if i < 10 then
        puts(1, ", ")
    end if
end for

While, yes, use of exit would also work here, it is slightly faster to code it this way, if only the last iteration has something different.

F#

Functional version that works for lists of any length

let rec print (lst : int list) =
    match lst with
    | hd :: [] ->
        printf "%i " hd
    | hd :: tl ->
        printf "%i, " hd
        print tl
    | [] -> printf "\n"

print [1..10]

Factor

: print-comma-list ( n -- )
    [ [1,b] ] keep '[
        [ number>string write ]
        [ _ = [ ", " write ] unless ] bi
    ] each nl ;

Falcon

for value = 1 to 10
    formiddle 
        >> value
        >> ", "
    end
    forlast: > value
end
Output:
prompt$ falcon forto.fal
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

FALSE

1[$9>~][$.", "1+]#.

Fantom

class Main
{
  public static Void main ()
  {
    for (Int i := 1; i <= 10; i++)
    {
      Env.cur.out.writeObj (i)
      if (i == 10) break
      Env.cur.out.writeChars (", ")
    }
    Env.cur.out.printLine ("")
  }
}

Forth

: comma-list ( n -- )
  dup 1 ?do  i 1 .r ." , " loop
  . ;
: comma-list ( n -- )
  dup 1+ 1 do
    i 1 .r
    dup i = if leave then   \ or DROP UNLOOP EXIT to exit loop and the function
    [char] , emit space
  loop drop ;
: comma-list ( n -- )
  1
  begin  dup 1 .r
         2dup <>
  while  ." , " 1+
  repeat 2drop ;

Fortran

Works with: FORTRAN version IV and later
C     Loops N plus one half - Fortran IV (1964)
      INTEGER I
      WRITE(6,301) (I,I=1,10)
  301 FORMAT((I3,','))
      END
Works with: Fortran version 77 and later
C     WARNING: This program is not valid ANSI FORTRAN 77 code. It uses
C     two nonstandard characters on the lines labelled 5001 and 5002.
C     Many F77 compilers should be okay with it, but it is *not*
C     standard.
      PROGRAM LOOPPLUSONEHALF
        INTEGER I, TEN
C       I'm setting a parameter to distinguish from the label 10.
        PARAMETER (TEN = 10)

        DO 10 I = 1, TEN
C         Write the number only.
          WRITE (*,5001) I

C         If we are on the last one, stop here. This will make this test
C         every iteration, which can slow your program down a little. If
C         you want to speed this up at the cost of your own convenience,
C         you could loop only to nine, and handle ten on its own after
C         the loop is finished. If you don't care, power to you.
          IF (I .EQ. TEN) GOTO 10

C         Append a comma to the number.
          WRITE (*,5002) ','
   10   CONTINUE

C       Always finish with a newline. This programmer hates it when a
C       program does not end its output with a newline.
        WRITE (*,5000) ''
        STOP

 5000   FORMAT (A)

C       Standard FORTRAN 77 is completely incapable of completing a
C       WRITE statement without printing a newline. This program would
C       be much more difficult (i.e. impossible) to write in the ANSI
C       standard, without cheating and saying something like:
C
C           WRITE (*,*) '1, 2, 3, 4, 5, 6, 7, 8, 9, 10'
C
C       The dollar sign at the end of the format is a nonstandard
C       character. It tells the compiler not to print a newline. If you
C       are actually using FORTRAN 77, you should figure out what your
C       particular compiler accepts. If you are actually using Fortran
C       90 or later, you should replace this line with the commented
C       line that follows it.
 5001   FORMAT (I3, $)
 5002   FORMAT (A, $)
C5001   FORMAT (T3, ADVANCE='NO')
C5001   FORMAT (A, ADVANCE='NO')
      END
Works with: Fortran version 90 and later
i = 1
do
  write(*, '(I0)', advance='no') i
  if ( i == 10 ) exit
  write(*, '(A)', advance='no') ', '
  i = i + 1
end do
write(*,*)

GAP

n := 10;
for i in [1 .. n] do
    Print(i);
    if i < n then
        Print(", ");
    else
        Print("\n");
    fi;
od;

GML

str = ""
for(i = 1; i <= 10; i += 1)
    {
    str += string(i)
    if(i != 10)
        str += ", "
    }
show_message(str)

Go

package main

import "fmt"

func main() {
    for i := 1; ; i++ {
        fmt.Print(i)
        if i == 10 {
            fmt.Println()
            break
        }
        fmt.Print(", ")
    }
}

Gosu

var out = System.out
for(i in 1..10) {
  if(i > 1) out.print(", ")
  out.print(i)
}

Groovy

Solution:

for(i in (1..10)) {
    print i
    if (i == 10) break
    print ', '
}

Output:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Haskell

main :: IO ()
main = forM_ [1 .. 10] $ \n -> do
            putStr $ show n
            putStr $ if n == 10 then "\n" else ", "

You can also use intersperse :: a -> [a] -> [a]

intercalate ", " (map show [1..10])

Haxe

for (i in 1...11)
  Sys.print('$i${i == 10 ? '\n' : ', '}');

hexiscript

for let i 1; i <= 10; i++
  print i
  if i = 10; break; endif
  print ", "
endfor
println ""

HicEst

DO i = 1, 10
    WRITE(APPend) i
    IF(i < 10) WRITE(APPend) ", "
ENDDO

HolyC

U8 i, max = 10;
for (i = 1; i <= max; i++) {
  Print("%d", i);
  if (i == max) break;
  Print(", ");
}
Print("\n");

Icon and Unicon

procedure main()
every writes(i := 1 to 10) do 
   if i = 10 then break write()
   else writes(", ")
end

The above can be written more succinctly as:

every writes(c := "",1 to 10) do c := ","

IDL

Nobody would ever use a loop in IDL to output a vector of numbers - the requisite output would be generated something like this:

print,indgen(10)+1,format='(10(i,:,","))'

However if a loop had to be used it could be done like this:

for i=1,10 do begin
 print,i,format='($,i)'
 if i lt 10 then print,",",format='($,a)'
endfor

(which merely suppresses the printing of the comma in the last iteration);

or like this:

for i=1,10 do begin
 print,i,format='($,i)'
 if i eq 10 then break
 print,",",format='($,a)'
end

(which terminates the loop early if the last element is reached).

J

output=: verb define
  buffer=: buffer,y
)

loopy=: verb define
  buffer=: ''
  for_n. 1+i.10 do.
    output ":n
    if. n<10 do.
      output ', '
    end.
  end.
  echo buffer
)

Example use:

   loopy 0
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

That said, note that neither loops nor output statements are necessary:

   ;}.,(', ' ; ":)&> 1+i.10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

And, note also that this sort of data driven approach can also deal with more complex issues:

   commaAnd=: ":&.> ;@,. -@# {. (<;._1 '/ and /') ,~ (<', ') #~ #  
   commaAnd i.5
0, 1, 2, 3 and 4

Java

public static void main(String[] args) {
    for (int i = 1; ; i++) {
        System.out.print(i);
        if (i == 10)
            break;
        System.out.print(", ");
    }
    System.out.println();
}

JavaScript

function loop_plus_half(start, end) {
    var str = '',
        i;
    for (i = start; i <= end; i += 1) {
        str += i;
        if (i === end) {
          break;
        }
        str += ', ';
    }
    return str;
}
 
alert(loop_plus_half(1, 10));

Alternatively, if we stand back for a moment from imperative assumptions about the nature and structure of computing tasks, it becomes clear that the problem of special transitional cases as a pattern terminates has no necessary connection with loops. (See the comments accompanying the ACL2, Haskell, IDL, J and R examples above and below, and see also some of the approaches taken in languages like Clojure and Scala.

If a JavaScript expression evaluates to an array [1 .. 10] of integers, for example, we can map that array directly to a comma-delimited string by using the Array.join() function, writing something like:

function range(m, n) {
  return Array.apply(null, Array(n - m + 1)).map(
    function (x, i) {
      return m + i;
    }
  );
}
 
console.log(
  range(1, 10).join(', ')
);

Output:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Otherwise, any special transitional case at the end of a pattern can be handled by defining conditional values for one or more sub-expressions:

function range(m, n) {
  return Array.apply(null, Array(n - m + 1)).map(function (x, i) {
    return m + i;
  });
}

console.log(
  (function (nFrom, nTo) {
    var iLast = nTo - 1;

    return range(nFrom, nTo).reduce(
      function (accumulator, n, i) {
        return accumulator +
          n.toString() +

          (i < iLast ? ', ' : ''); // conditional sub-expression

      }, ''
    )
  })(1, 10)
);

Output:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Otherwise

var s=1, e=10
for (var i=s; i<=e; i+=1) {
	document.write( i==s ? '' : ', ', i )
}

or

var s=1, e=10
for (;; s+=1) {
	document.write( s )
	if (s==e) break
	document.write( ', ' )
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 

jq

In jq, it is idiomatic to view a range of integers with boundaries m and n as [m, n), i.e. including m but excluding n.

One approach is to construct the answer incrementally:
def loop_plus_half(m;n):
  if m<n then reduce range(m+1;n) as $i (m|tostring; . +  ", " + ($i|tostring))
  else empty
  end;

# An alternative that is shorter and perhaps closer to the task description because it uses range(m;n) is as follows:
def loop_plus_half2(m;n):
  [range(m;n) | if . == m then . else  ", ", . end | tostring] | join("");
Output:
loop_plus_half2(1;11)
# "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"

Julia

The short-circuiting && is idiomatic to Julia - the second expression will only be evaluated if the first one is true.

for i = 1:10
  print(i)
  i == 10 && break
  print(", ")
end

Output:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

K

   p:{`0:$x} / output
   i:1;do[10;p[i];p[:[i<10;", "]];i+:1];p@"\n"
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Alternative solutions:

   10 {p@x;p@:[x<10;", ";"\n"];x+1}\1;
   {p@x;p@:[x<10;", ";"\n"];x+1}'1+!10; /variant

Kotlin

// version 1.0.6

fun main(args: Array<String>) {
    for (i in 1 .. 10) {
        print(i)
        if (i < 10) print(", ")
    }
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

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.

Lambdatalk

{def loops_N_plus_one_half
 {lambda {:i :n}
  {if {> :i :n}
   then (end of loop with a dot)
   else {if {= :i 6} then {br}:i else :i}{if {= :i :n} then . else ,}
        {loops_N_plus_one_half {+ :i 1} :n}}}}
-> loops_N_plus_one_half

{loops_N_plus_one_half 0 10}
-> 0, 1, 2, 3, 4, 5, 
6, 7, 8, 9, 10. (end of loop with a dot)

Lang

# Loop
$i = 1
loop {
	fn.print($i)
	if($i === 10) {
		con.break
	}
	
	fn.print(\,\s)
	
	$i += 1
}
fn.println()

# Array generate from and join
fn.println(fn.join(\,\s, fn.arrayGenerateFrom(fn.inc, 10)))
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Lang5

: ,  dup ", " 2 compress "" join ;
1 do dup 10 != if dup , . 1 + else . break then loop

Word: Loops/For#Lang5

: 2string  2 compress "" join ;
: ,  dup 10 != if ", " 2string then ;
1 10 "dup , . 1+" times

Lasso

local(out) = ''
loop(10) => {
    #out->append(loop_count)
    loop_count == 10 ? loop_abort
    #out->append(', ')
}
#out

Lhogho

type doesn't output a newline. The print outputs one.

for "i [1 10] 
[
	type :i
	if :i < 10 
	[
		type "|, |
	]
]
print

A more list-y way of doing it

to join :lst :sep
	if list? :lst
	[
		ifelse count :lst > 1
		[
			op (word first :lst :sep joinWith butfirst :lst :sep)
		]
		[
			op (word last :lst)
		]
	]
	op :lst
end

make "aList [1 2 3 4 5 6 7 8 9 10]
print join :aList "|, |

Lisaac

Section Header

+ name := LOOP_AND_HALF;

Section Public

- main <- (
  + i : INTEGER;

  i := 1;
  {
    i.print;
    i = 10
  }.until_do {
    ", ".print;
    i := i + 1;
  };
  '\n'.print;
);

LiveCode

repeat with n = 1 to 10
    put n after loopn
    if n is not 10 then put comma after loopn
end repeat
put loopn

to comma.list :n
  repeat :n-1 [type repcount type "|, |]
  print :n
end

comma.list 10

Lua

Translation of C:

for i = 1, 10 do
  io.write(i)
  if i == 10 then break end
  io.write", "
end

M2000 Interpreter

Module Checkit {
      \\ old type loop
      For i=1 to 10
            Print i;
            If i=10 Then Exit For
            Print ", ";
      Next i
      Print
      \\ fast type loop. Continue exit block, without breaking loop.
      For i=1 to 10 {
                  Print i;
                  If i=10 Then Continue
                  Print ", ";
      }
      Print
      Print
      i=0
      {
                  loop  \\ this mark block for loop, each time need to mark
                  i++
                  Print i;
                  If i=10 Then Exit  ' so now we use exit to break loop
                  Print ", ";      
      }
      Print
}
Checkit

M4

define(`break',
   `define(`ulim',llim)')
define(`for',
   `ifelse($#,0,``$0'',
   `define(`ulim',$3)`'define(`llim',$2)`'ifelse(ifelse($3,`',1,
         `eval($2<=$3)'),1,
   `pushdef(`$1',$2)$4`'popdef(`$1')$0(`$1',incr($2),ulim,`$4')')')')

for(`x',`1',`',
   `x`'ifelse(x,10,`break',`, ')')

Make

NEXT=`expr $* + 1`
MAX=10
RES=1

all: 1-n;

$(MAX)-n:
       @echo $(RES)

%-n:
       @-make -f loop.mk $(NEXT)-n MAX=$(MAX) RES=$(RES),$(NEXT)

Invoking it

|make -f loop.mk MAX=10
1,2,3,4,5,6,7,8,9,10

Maple

> for i to 10 do printf( "%d%s", i, `if`( i = 10, "\n", ", " ) ) end:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Mathematica/Wolfram Language

i = 1; s = "";
While[True,
 s = s <> ToString@i;
 If[i == 10, Break[]];
 s = s <> ",";
 i++;
 ]
s

MATLAB / Octave

Vectorized form:

 	printf('%i, ',1:9); printf('%i\n',10);

Explicite loop:

   for k=1:10,
      printf('%i', k); 
   if k==10, break; end;
      printf(', ');
   end; 
   printf('\n');

Output:

  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 

MAXScript

for i in 1 to 10 do
(
    format "%" i
    if i == 10 then exit
    format "%" ", "
)

Metafont

Since message append always a newline, we need building the output inside a string, and then we output it.

last := 10;
string s; s := "";
for i = 1 upto last:
  s := s & decimal i;
  if i <> last: s := s & ", " fi;
endfor
message s;
end

min

min's linrec combinator is flexible enough to easily accomodate this task, due to taking a quotation to execute at the end of the loop (the second one).

1 (dup 10 ==) 'puts! (print succ ", " print!) () linrec

Modula-3

MODULE Loop EXPORTS Main;

IMPORT IO, Fmt;

VAR i := 1;

BEGIN
  LOOP
    IO.Put(Fmt.Int(i));
    IF i = 10 THEN EXIT; END;
    IO.Put(", ");
    i := i + 1;
  END;
  IO.Put("\n");
END Loop.

MUMPS

LOOPHALF
 NEW I
 FOR I=1:1:10 DO
 .WRITE I
 .IF I'=10 WRITE ", "
 QUIT
 ;Alternate
 NEW I FOR I=1:1:10 WRITE I WRITE:I'=10 ", "
 KILL I QUIT

Output:

USER>D LOOPHALF^ROSETTA
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
USER>D LOOPHALF+7^ROSETTA
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Nemerle

foreach (i in [1 .. 10])
{
    Write(i);
    unless (i == 10) Write(", ");
}

NetRexx

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

  say
  say 'Loops/N plus one half'

  rs = ''
  istart = 1
  iend   = 10
  loop i_ = istart to iend
    rs = rs || ' ' || i_
    if i_ < iend then do
      rs = rs','
      end
    end i_
  say rs.strip()

Output

Loops/N plus one half
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

NewLISP

(for (i 0 10)
  (print i)
  (unless (= i 10)
    (print ", ")))

Nim

var s = ""
for i in 1..10:
  s.add $i
  if i == 10: break
  s.add ", "
echo s
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Objeck

bundle Default {
  class Hello {
    function : Main(args : String[]) ~ Nil {
      for(i := 1; true; i += 1;) {
        i->Print();
        if(i = 10) {
          break;
        };
        ", "->Print();
      };
      '\n'->Print();
    }
  }
}

OCaml

let last = 10 in
for i = 1 to last do
  print_int i;
  if i <> last then
    print_string ", ";
done;
print_newline();
let ints = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] in
let str_ints = List.map string_of_int ints in
print_endline (String.concat ", " str_ints);

Oforth

: loopn
| i |
   10 loop: i [ i dup print 10 ifEq: [ break ] "," . ] printcr ;

Oz

Using a for-loop:

for N in {List.number 1 10 1} break:Break do
   {System.printInfo N}
   if N == 10 then {Break} end
   {System.printInfo ", "}
end

However, it seems more natural to use a left fold:

declare
  fun {CommaSep Xs}
     case Xs of nil then nil
     [] X|Xr then
	{FoldL Xr 
	 fun {$ Z X} Z#", "#X end
	 X}
     end
  end
in
  {System.showInfo {CommaSep {List.number 1 10 1}}}

Panda

Panda is stream based. To know if there is no more values you need to know it's the last. You can only do that if you get all the values. So this is functional style; We accumulate all the values from the stream. Then join them together as strings with a comma.

array{{1..10}}.join(',')

PARI/GP

n=0;
while(1,
  print1(n++);
  if(n>9, break);
  print1(", ")
);

Pascal

program numlist(output);

const MAXNUM: integer = 10;
var
  i: integer;

begin
  { loop 1: w/ if branching }
  for i := 1 to MAXNUM do
    begin
      write(i);
      if i <> MAXNUM then
        write(', ')
    end;
  writeln;
  { loop 2: w/o if branching }
  for i := 1 to MAXNUM-1 do
    write(i, ', ');
  writeln(MAXNUM);
end.

Peloton

<@ FORLITLIT>10|<@ SAYPOSFOR>...</@><@ ABF>,</@></@>

Perl

for my $i(1..10) {
    print $i;
    last if $i == 10;
    print ', ';
}
print "\n";

In perl one would solve the task via join.

print join(', ', 1..10), "\n";

Phix

for i=1 to 10 do
    printf(1,"%d",i)
    if i=10 then exit end if
    printf(1,", ")
end for

Phixmonti

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

10 for dup print 10 == not if ", " print endif endfor
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
=== Press any key to exit ===

PHP

for ($i = 1; $i <= 11; $i++) {
    echo $i;
    if ($i == 10)
        break;
    echo ', ';
}
echo "\n";

PicoLisp

(for N 10
   (prin N)
   (T (= N 10))
   (prin ", ") )

Pike

int main(){
   for(int i = 1; i <= 11; i++){
      write(sprintf("%d",i));
      if(i == 10){
         break;
      }
      write(", ");
   }
   write("\n");
}

The most idiomatic way of inserting delimiters in Pike is the multiplication operator and it's symmetry with division of strings.

> "1, 2, 3"/", ";
Result: ({ "1", "2", "3" })
> ({ "1", "2", "3" })*", ";
Result: "1, 2, 3"

So achieving the result of this task with the method more suited to Pike would be:

array a = (array(string))enumerate(10, 1, 1);
write(a * ", " + "\n");

PL/I

do i = 1 to 10;
   put edit (trim(i)) (a);
   if i < 10 then put edit (', ') (a);
end;

Plain English

To run:
Start up.
Write the numbers up to 10 on the console.
Wait for the escape key.
Shut down.

To write the numbers up to a number on the console:
If a counter is past the number, exit.
Convert the counter to a string.
Write the string on the console without advancing.
If the counter is less than the number, write ", " on the console without advancing.
Repeat.

Pop11

lvars i;
for i from 1 to 10 do
    printf(i, '%p');
    quitif(i = 10);
    printf(', ', '%p');
endfor;
printf('\n', '%p');

PowerShell

Translation of: C
for ($i = 1; $i -le 10; $i++) {
    Write-Host -NoNewLine $i
    if ($i -eq 10) {
        Write-Host
        break
    }
    Write-Host -NoNewLine ", "
}

An interesting alternative solution, although not strictly a loop, even though switch certainly loops over the given range.

switch (1..10) {
    { $true }     { Write-Host -NoNewLine $_ }
    { $_ -lt 10 } { Write-Host -NoNewLine ", " }
    { $_ -eq 10 } { Write-Host }
}

Prolog

example :- 
  between(1,10,Val), write(Val), Val<10, write(', '), fail.
example.
?- example.
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
true.

Python

The particular pattern and example chosen in the task description is recognised by the Python language and there are more idiomatic ways to achieve the result that don't even require an explicit conditional test such as:

print ( ', '.join(str(i+1) for i in range(10)) )

But the named pattern is shown by code such as the following:

>>> from sys import stdout
>>> write = stdout.write
>>> n, i = 10, 1
>>> while True:
    write(i)
    i += 1
    if i > n:
        break
    write(', ')

    
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
>>>

List comprehension one-liner

[print(str(i+1) + ", ",end='') if i < 9 else print(i+1) for i in range(10)]
Works with: Python version 3.x
n, i = 10, 1
while True:
    print(i, end="")
    i += 1
    if i > n:
        break
    print(", ", end="")

Quackery

  10 times 
     [ i^ 1+ echo
       i 0 = iff 
          conclude done
       say ", " ]
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

R

The natural way to solve this task in R is:

paste(1:10, collapse=", ")

The task specifies that we should use a loop however, so this more verbose code is needed.

for(i in 1:10)
{
   cat(i)
   if(i==10) 
   {
      cat("\n")
      break
   }
   cat(", ")
}

Racket

#lang racket
(for ((i (in-range 1 15)))
  (display i)
  #:break (= 10 i)
  (display ", "))

Gives the desired output.

Raku

(formerly Perl 6)

for 1 .. 10 {
    .print;
    last when 10;
    print ', ';
}

print "\n";

REBOL

REBOL [
    Title: "Loop Plus Half"
    URL: http://rosettacode.org/wiki/Loop/n_plus_one_half
]

repeat i 10 [
	prin i
	if 10 = i [break]
	prin ", "
]
print ""

Red

Red[]

repeat i 10 [
    prin i
    if 10 = i [break]
    prin ", "
]
print ""

Relation

set i = 1
set result = ""
while i <= 10
set result = result . i
if i < 10
set result = result . ", "
end if
set i = i + 1
end while
echo result

REXX

two CHAROUTs

/*REXX program displays:                 1,2,3,4,5,6,7,8,9,10                           */

     do j=1  to 10
     call charout ,j                             /*write the  DO loop  index  (no LF).  */
     if j<10  then call charout ,","             /*append a comma for one-digit numbers.*/
     end   /*j*/
                                                 /*stick a fork in it,  we're all done. */

output

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

one CHAROUT

/*REXX program displays:                 1,2,3,4,5,6,7,8,9,10                           */

     do j=1  for 10                              /*using   FOR   is faster than    TO.  */
     call charout ,j || left(',',j<10)           /*display  J, maybe append a comma (,).*/
     end   /*j*/
                                                 /*stick a fork in it,  we're all done. */

output

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

version 3 if the number of items is not known

list='aa bb cc dd'
sep=', '
Do i=1 By 1 While list<>''
  If i>1 Then Call charout ,sep
  Parse Var list item list
  Call charout ,item
  End
Output:
aa, bb, cc, dd

Ring

for x = 1 to 10 see x if x=10 exit ok see ", " next see nl

RPL

There are basically 2 possibilities, based on an overarching FOR..NEXT or DO..UNTIL / WHILE..REPEAT loop structure, in which an IF..THEN..ELSE decides which parts of the loop must be executed. RPL does not have any instruction to just exit a loop. The DO..UNTIL / WHILE..REPEAT approach requires to use a flag and to manage a counter, which weighs down the code, as it can be seen in the implementations below.

≪ ""
   1 10 FOR j
      j →STR +
      IF j 10 < THEN ", " + END
  NEXT
≫ 'S1→10' STO

17 words

≪ 1 CF "" 0 
   DO
      1 + SWAP OVER →STR +
      IF OVER 10 < THEN ", " + ELSE 1 SF END
      SWAP
   UNTIL 1 FS? END
   DROP
≫  'S1→10' STO

28 words + 1 flag

Ruby

(1..10).each do |i|
  print i
  break if i == 10
  print ", "
end
puts

More idiomatic Ruby to obtain the same result is:

puts (1..10).join(", ")

Rust

fn main() {
    for i in 1..=10 {
        print!("{}{}", i, if i < 10 { ", " } else { "\n" });
    }
}

More like the problem description:

fn main() {
    for i in 1..=10 {
        print!("{}", i);
        if i == 10 { 
            break;
        }
        print!(", ");
    }
    println!();
}

Alternative solution using join.

fn main() {
    println!(
        "{}",
        (1..=10)
            .map(|i| i.to_string())
            .collect::<Vec<_>>()
            .join(", ")
    );
}

S-lang

This may constitute not following directions, but I've always felt the most readable and general way to code this is to move the "optional" part from the bottom to the top of the loop, then NOT include it on the FIRST pass:

variable more = 0, i;
foreach i ([1:10]) {
  if (more) () = printf(", ");
  printf("%d", i);
  more = 1;
}

Salmon

iterate (x; [1...10])
  {
    print(x);
    if (x == 10)
        break;;
    print(", ");
  };
print("\n");

Scala

Library: Scala
var i = 1
while ({
  print(i)
  i < 10
}) {
  print(", ")
  i += 1
}
println()
println((1 to 10).mkString(", "))

Scheme

It is possible to use continuations:

(call-with-current-continuation
 (lambda (esc)
   (do ((i 1 (+ 1 i))) (#f)
     (display i)
     (if (= i 10) (esc (newline)))
     (display ", "))))

But usually making the tail recursion explicit is enough:

(let loop ((i 0))
  (display i)
  (if (= i 10)
      (newline)
      (begin
        (display ", ")
        (loop (+ 1 i)))))

Scilab

Works with: Scilab version 5.5.1
for i=1:10
    printf("%2d ",i)
    if i<10 then printf(", "); end
end
printf("\n")
Output:
 1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 

Seed7

$ include "seed7_05.s7i";

const proc: main is func
  local
    var integer: number is 0;
  begin
    for number range 1 to 10 do
      write(number);
      if number < 10 then
        write(", ")
      end if;
    end for;
    writeln;
  end func;

Sidef

for (1..10) { |i|
    print i;
    i == 10 && break;
    print ', ';
}

print "\n";

Smalltalk

1 to: 10 do: [:n |
    Transcript show: n asString.
    n < 10 ifTrue: [ Transcript show: ', ' ]
]

Smalltalk/X and Pharo/Squeak have special enumeration messages for this in their Collection class, which executes another action in-between iterated elements:

Works with: Smalltalk/X
Works with: Pharo
(1 to: 10) do: [:n |
    Transcript show: n asString.
] separatedBy:[
    Transcript show: ', '
]

That is a bit different from the task's specification, but does what is needed here, and is more general in working with any collection (in the above case: a range aka "Interval"). It does not depend on the collection being addressed by an integer index and/or keeping a count inside the loop.

SNOBOL4

It's idiomatic in Snobol to accumulate the result in a string buffer for line output, and to use the same statement for loop control and the comma.

loop    str = str lt(i,10) (i = i + 1) :f(out)
        str = str ne(i,10) ',' :s(loop)
out     output = str
end
Works with: Macro Spitbol

For the task description, it's possible (implementation dependent) to set an output variable to raw mode for character output within the loop.

This example also breaks the loop explicitly:

        output('out',1,'-[-r1]')
loop    i = lt(i,10) i + 1 :f(end)
        out = i
        eq(i,10) :s(end)
        out = ',' :(loop)
end
Output:
1,2,3,4,5,6,7,8,9,10

SNUSP

@\>@\>@\>+++++++++<!/+.  >-?\#  digit and loop test
 |  |  \@@@+@+++++# \>>.<.<</    comma and space
 |  \@@+@@+++++#      
 \@@@@=++++#

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)

  repeat n from 1 to 10
    ser.dec(n)
    if n<10
      ser.str(string(", "))
  ser.str(string(13, 10))

  waitcnt(_clkfreq + cnt)
  ser.stop
  cogstop(0)
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Stata

forv i=1/10 {
	di `i' _continue
	if `i'<10 {
		di ", " _continue
	}
	else {
		di
	}
}

Mata

mata
for (i=1; i<=10; i++) {
	printf("%f",i)
	if (i<10) {
		printf(", ")
	} else {
		printf("\n")
	}
}
end

Swift

Works with: Swift version 1.x
for var i = 1; ; i++ {
    print(i)
    if i == 10 {
        println()
        break
    }
    print(", ")
}
Works with: Swift version 2

The usual way to do this with Swift 2 is:

for i in 1...10 {
    
    print(i, terminator: i == 10 ? "\n" : ", ")
}

To satisfy the specification, we have to do something similar to Swift 1.x and other C-like languages:

for var i = 1; ; i++ {
    print(i, terminator: "")
    if i == 10 {
        print("")
        break
    }
    print(", ", terminator: "")
}

Tcl

for {set i 1; set end 10} true {incr i} {
    puts -nonewline $i
    if {$i >= $end} break
    puts -nonewline ", "
}
puts ""

However, that's not how the specific task (printing 1..10 with comma separators) would normally be done. (Note, the solution below is not a solution to the half-looping problem.)

proc range {from to} {
    set result {}
    for {set i $from} {$i <= $to} {incr i} {
        lappend result $i
    }
    return $i
}
 
puts [join [range 1 10] ", "] ;# ==> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

TUSCRIPT

$$ MODE TUSCRIPT
line=""
LOOP n=1,10
 line=CONCAT (line,n)
 IF (n!=10) line=CONCAT (line,", ")
ENDLOOP
PRINT line

Output:

1,  2,  3,  4,  5,  6,  7,  8,  9,  10

UNIX Shell

for(( Z=1; Z<=10; Z++ )); do
    echo -e "$Z\c"
    if (( Z != 10 )); then
        echo -e ", \c"
    fi
done
Works with: Bash
for ((i=1;i<=$((last=10));i++)); do
  echo -n $i
  [ $i -eq $last ] && break
  echo -n ", "
done

UnixPipes

The last iteration is handled automatically for us when there is no element in one of the pipes.

yes \ | cat -n | head -n 10 | paste -d\  - <(yes , | head -n 9) | xargs echo

Ursa

Translation of: PHP
decl int i
for (set i 1) (< i 11) (inc i)
        out i console
        if (= i 10)
                break
        end if
        out ", " console
end for
out endl console

V

[loop 
   [ [10 =] [puts]
     [true] [dup put ',' put succ loop]
   ] when].

Using it

|1 loop
=1,2,3,4,5,6,7,8,9,10

Vala

Translation of: C
void main() {
  for (int i = 1; i <= 10; i++)
  {
    stdout.printf("%d", i);
    stdout.printf(i == 10 ? "\n" : ", ");
  }
}

Vedit macro language

This example writes the output into current edit buffer.

for (#1 = 1; 1; #1++) {
    Num_Ins(#1, LEFT+NOCR)
    if (#1 == 10) { Break }
    Ins_Text(", ")
}
Ins_Newline

Verilog

module main;
  integer  i;
  
  initial begin
    for(i = 1; i <= 10; i = i + 1)  begin
        $write(i);
        if (i < 10 ) $write(", ");
    end
  $display("");
  $finish ;
  end
endmodule
Output:
1,           2,           3,           4,           5,           6,           7,           8,           9,          10


Vim Script

for i in range(1, 10)
   echon i
   if (i != 10)
      echon ", "
   endif
endfor

V (Vlang)

fn main() {
    for i := 1; ; i++ {
        print(i)
        if i == 10 {
            break
        }
        print(", ")
    }
}

Wart

for i 1 (i <= 10) ++i
  pr i
  if (i < 10)
    pr ", "
(prn)

Wren

for (i in 1..10) {
    System.write(i)
    System.write((i < 10) ? ", " : "\n")
}
Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

XPL0

codes CrLf=9, IntOut=11, Text=12;
int  N;
[for N:= 1 to 10 do     \best way to do this
        [IntOut(0, N);  if N#10 then Text(0, ", ")];
CrLf(0);

N:= 1;                  \way suggested by task statement
loop    [IntOut(0, N);
        if N=10 then quit;
        Text(0, ", ");
        N:= N+1;
        ];
CrLf(0);
]

zkl

foreach n in ([1..10]){ print(n); if (n!=10) print(",") }

Or, using a state machine:

[1..10].pump(Console.print, Void.Drop, T(Void.Write,",",Void.Drop));

where pump is (sink, action, action ...). The first Drop writes the first object from the source (1) to the sink and drops out (and that iteration of the loop is done). For the rest of the loop, Write collects things to write to the sink: a comma and the number, eg ",2". Or:

[1..10].pump(Console.print, Void.Drop, fcn(n){ String(",",n) });

Zig

const std = @import("std");
pub fn main() !void {
    const stdout_wr = std.io.getStdOut().writer();
    var i: u8 = 1;
    while (i <= 10) : (i += 1) {
        try stdout_wr.print("{d}", .{i});
        if (i == 10) {
            try stdout_wr.writeAll("\n");
        } else {
            try stdout_wr.writeAll(", ");
        }
    }
}