Comma quibbling: Difference between revisions

m
→‎{{header|PHP}}: fix formatting.
(Added R.)
m (→‎{{header|PHP}}: fix formatting.)
 
(41 intermediate revisions by 22 users not shown)
Line 23:
 
=={{header|11l}}==
<langsyntaxhighlight lang="11l">F quibble(words)
R S words.len
0
Line 35:
print(quibble([‘ABC’]))
print(quibble([‘ABC’, ‘DEF’]))
print(quibble([‘ABC’, ‘DEF’, ‘G’, ‘H’]))</langsyntaxhighlight>
{{out}}
<pre>
Line 45:
 
=={{header|360 Assembly}}==
<langsyntaxhighlight lang="360asm">* Comma quibbling 13/03/2017
COMMAQUI CSECT
USING COMMAQUI,R13 base register
Line 121:
CJ DS CL1
YREGS
END COMMAQUI</langsyntaxhighlight>
{{out}}
<pre>
Line 132:
=={{header|8080 Assembly}}==
 
<langsyntaxhighlight lang="8080asm"> org 100h
jmp demo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 214:
db 'ABC$DEF$$'
db 'ABC$DEF$G$H$$'
buffer:</langsyntaxhighlight>
 
{{out}}
Line 223:
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|ABC}}==
<syntaxhighlight lang="ABC">HOW TO RETURN quibble words:
PUT "" IN result
PUT #words IN remaining
FOR word IN words:
PUT result^word IN result
PUT remaining-1 IN remaining
IF remaining = 1: PUT result^" and " IN result
IF remaining > 1: PUT result^", " IN result
RETURN "{" ^ result ^ "}"
 
PUT {} IN tests
INSERT {} IN tests
INSERT {[1]: "ABC"} IN tests
INSERT {[1]: "ABC"; [2]: "DEF"} IN tests
INSERT {[1]: "ABC"; [2]: "DEF"; [3]: "G"; [4]: "H"} IN tests
FOR test IN tests:
WRITE quibble test/</syntaxhighlight>
{{out}}
<pre>{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|Acornsoft Lisp}}==
 
There's no string data type; symbols are used instead. The <code>implode</code> function is used to concatenate a list of symbols. When writing a symbol in source code, exclamation mark is an escape character that allows characters such as spaces and exclamation marks to be treated as part of the symbol's name.
 
<syntaxhighlight lang="lisp">
(defun examples ()
(map '(lambda (words) (printc (quibble words)))
'(() (ABC) (ABC DEF) (ABC DEF G H))))
 
(defun quibble (words)
(implode (list '{ (quibbles words) '})))
 
(defun quibbles (words)
(implode (conjunction words)))
 
(defun conjunction (words)
(cond ((null words)
'())
((null (cdr words))
words)
((null (cddr words))
(list (car words) '! and! (cadr words)))
(t
(cons (car words)
(cons ',! (conjunction (cdr words)))))))
</syntaxhighlight>
 
{{out}}
 
Calling <code>(examples)</code> will output:
 
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE PTR="CARD"
 
PROC Append(CHAR ARRAY text,suffix)
BYTE POINTER srcPtr,dstPtr
BYTE len
 
len=suffix(0)
IF text(0)+len>255 THEN
len=255-text(0)
FI
IF len THEN
srcPtr=suffix+1
dstPtr=text+text(0)+1
MoveBlock(dstPtr,srcPtr,len)
text(0)==+suffix(0)
FI
RETURN
 
PROC Quibble(PTR ARRAY items INT count CHAR ARRAY result)
INT i
 
result(0)=0
Append(result,"(")
FOR i=0 TO count-1
DO
Append(result,items(i))
IF i=count-2 THEN
Append(result," and ")
ELSEIF i<count-2 THEN
Append(result,", ")
FI
OD
Append(result,")")
RETURN
 
PROC Test(PTR ARRAY items BYTE count)
CHAR ARRAY result(256)
 
Quibble(items,count,result)
PrintE(result)
RETURN
 
PROC Main()
PTR ARRAY items(5)
 
Test(items,0)
 
items(0)="ABC"
Test(items,1)
 
items(1)="DEF"
Test(items,2)
 
items(2)="G"
Test(items,3)
 
items(3)="H"
Test(items,4)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Comma_quibbling.png Screenshot from Atari 8-bit computer]
<pre>
()
(ABC)
(ABC and DEF)
(ABC, DEF and G)
(ABC, DEF, G and H)
</pre>
 
=={{header|Ada}}==
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO, Ada.Command_Line; use Ada.Command_Line;
 
procedure Comma_Quibble is
Line 241 ⟶ 373:
Argument(Argument_Count) & "}");
end case;
end Comma_Quibble;</langsyntaxhighlight>
 
{{out}}
Line 256 ⟶ 388:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<langsyntaxhighlight lang="algol68"># returns a string ( assumed to be of space-separated words ) with the words #
# separated by ", ", except for the last which is separated from the rest by #
# " and ". The list is enclosed by braces #
Line 332 ⟶ 464:
test to list( "ABC" );
test to list( "ABC DEF" );
test to list( "ABC DEF G H" )</langsyntaxhighlight>
{{out}}
<pre>: {}
Line 341 ⟶ 473:
 
=={{header|ALGOL W}}==
<langsyntaxhighlight lang="algolw">begin
 
% returns a list of the words contained in wordString, separated by ", ", %
Line 447 ⟶ 579:
testToList( "ABC DEF G H" );
 
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 454 ⟶ 586:
ABC DEF : {ABC and DEF}
ABC DEF G H : {ABC, DEF, G and H}</pre>
 
=={{header|APL}}==
<syntaxhighlight lang="APL">quibble ← 1⌽'}{',(∊⊢,¨2↓(' and ' ''),⍨(⊂', ')⍴⍨⍴)</syntaxhighlight>
{{out}}
<pre> quibble ⍬
{}
quibble ⊂'ABC'
{ABC}
quibble 'ABC' 'DEF'
{ABC and DEF}
quibble 'ABC' 'DEF' 'G' 'H'
{ABC, DEF, G and H}</pre>
 
=={{header|AppleScript}}==
{{Trans|JavaScript}}
<langsyntaxhighlight AppleScriptlang="applescript">-- quibble :: [String] -> String
on quibble(xs)
if length of xs > 1 then
Line 641 ⟶ 785:
on |words|(s)
words of s
end |words|</langsyntaxhighlight>
{{Out}}
<pre>{}
Line 653 ⟶ 797:
 
=={{header|Arturo}}==
<langsyntaxhighlight lang="rebol">quibble: function $[seqsequence :block][
if? 0 =size seq ->size "{}"sequence
-> return "{}"
else [
if? 1=size seq -> "{" ++ seq\0 ++ "}"
if? 1 = size sequence
else -> "{" ++ (join.with:", " slice seq 0 (size seq)-1) ++ " and " ++ (last seq) ++ "}"
-> return ~"{|sequence\0|}"
]
last: pop 'sequence
return ~« {|join.with: ", " sequence| and |last|}
]
 
Line 670 ⟶ 817:
loop sentences 'sentence [
print quibble sentence
]</langsyntaxhighlight>
{{out}}
Line 676 ⟶ 823:
<pre>{}
{ABC}
{ABC, DEF and DEF}
{ABC, DEF, G, H and H}</pre>
 
=={{header|Astro}}==
<langsyntaxhighlight lang="python">fun quibble(s):
let result = s.join(' and ').replace(|| and ||, ", ", length(s) - 1)
return "{ $result }"
Line 692 ⟶ 839:
 
for i in s:
print(quibble i)</langsyntaxhighlight>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang="autohotkey">MsgBox % quibble([])
MsgBox % quibble(["ABC"])
MsgBox % quibble(["ABC", "DEF"])
Line 712 ⟶ 859:
}
return "{" . s . "}"
}</langsyntaxhighlight>
{{out}}
<pre>{}
Line 720 ⟶ 867:
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">function quibble(a, n, i, s) {
for (i = 1; i < n - 1; i++) s = s a[i] ", "
i = n - 1; if (i > 0) s = s a[i] " and "
Line 732 ⟶ 879:
n = split("ABC DEF", c); print quibble(c, n)
n = split("ABC DEF G H", d); print quibble(d, n)
}</langsyntaxhighlight>
{{out}}
<pre>{}
Line 740 ⟶ 887:
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">@echo off
setlocal enabledelayedexpansion
 
Line 780 ⟶ 927:
echo {!output!}
goto :EOF
::/THE FUNCTION</langsyntaxhighlight>
{{out}}
<pre>{}
Line 790 ⟶ 937:
 
=={{header|BCPL}}==
<langsyntaxhighlight BCPLlang="bcpl">get "libhdr"
 
// Add a character to the end of a string
Line 836 ⟶ 983:
words!2 := "G" ; words!3 := "H" ; words!4 := 0
writef("%S*N", quibble(words, buf))
$)</langsyntaxhighlight>
{{out}}
<pre>{}
Line 844 ⟶ 991:
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( :?L1
& ABC:?L2
& ABC DEF:?L3
Line 859 ⟶ 1,006:
& whl
' (!names:%?name ?names&out$(!name concat$!!name))
);</langsyntaxhighlight>
{{out}}
<pre>L1 {}
Line 867 ⟶ 1,014:
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
Line 919 ⟶ 1,066:
}
return EXIT_SUCCESS;
}</langsyntaxhighlight>
{{Out}}
<pre>{}
Line 928 ⟶ 1,075:
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Linq;
 
Line 960 ⟶ 1,107:
#endregion
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 970 ⟶ 1,117:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <iostream>
 
template<class T>
Line 995 ⟶ 1,142:
}
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,006 ⟶ 1,153:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(defn quibble [sq]
(let [sep (if (pos? (count sq)) " and " "")]
(apply str
Line 1,023 ⟶ 1,170:
 
(test quibble)
(test quibble-f)</langsyntaxhighlight>
{{out}}
<pre>{}
Line 1,030 ⟶ 1,177:
{ABC, DEF, G and H}
</pre>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">quibble = proc (words: array[string]) returns (string)
out: string := "{"
last: int := array[string]$high(words)
for i: int in array[string]$indexes(words) do
out := out || words[i]
if i < last-1 then
out := out || ", "
elseif i = last-1 then
out := out || " and "
end
end
return(out || "}")
end quibble
 
start_up = proc ()
as = array[string]
aas = array[as]
po: stream := stream$primary_output()
testcases: aas := aas$
[as$[],
as$["ABC"],
as$["ABC","DEF"],
as$["ABC","DEF","G","H"]]
for testcase: as in aas$elements(testcases) do
stream$putl(po, quibble(testcase))
end
end start_up</syntaxhighlight>
{{out}}
<pre>{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|COBOL}}==
{{works with|OpenCOBOL|2.0}}
<langsyntaxhighlight lang="cobol"> >>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. comma-quibbling-test.
Line 1,107 ⟶ 1,291:
MOVE FUNCTION CONCATENATE("{", str) TO str
.
END FUNCTION comma-quibbling.</langsyntaxhighlight>
 
{{out}}
Line 1,119 ⟶ 1,303:
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang="coffeescript">quibble = ([most..., last]) ->
'{' +
(most.join ', ') +
Line 1,128 ⟶ 1,312:
console.log quibble(s) for s in [ [], ["ABC"], ["ABC", "DEF"],
["ABC", "DEF", "G", "H" ] ]
</syntaxhighlight>
</lang>
{{out}}
<pre>{}
Line 1,134 ⟶ 1,318:
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|Commodore BASIC}}==
The Commodore character set has no curly braces, so I substituted square brackets. The solution could no doubt be improved, but some of the elegance of other solutions is not possible simply because a FOR loop always executes at least once, even if its parameters would seem to indicate that it should not.
<syntaxhighlight lang="basic">100 DIM A$(3)
110 FOR TC=1 TO 4
120 : READ A: IF A=0 THEN 160
130 : FOR I=0 TO A-1
140 : READ A$(I)
150 : NEXT I
160 : GOSUB 200
170 : PRINT CQ$
180 NEXT TC
190 END
200 CQ$="["
210 IF A < 1 THEN 290
220 CQ$ = CQ$ + A$(0)
230 IF A < 2 THEN 290
240 IF A < 3 THEN 280
250 FOR I=1 TO A - 2
260 : CQ$ = CQ$ + ", " + A$(I)
270 NEXT I
280 CQ$ = CQ$ + " AND " + A$(A - 1)
290 CQ$ = CQ$ + "]"
300 RETURN
310 DATA 0
320 DATA 1, ABC
330 DATA 2, ABC, DEF
340 DATA 4, ABC, DEF, G, H
</syntaxhighlight>
{{out}}
<pre>[]
[ABC]
[ABC AND DEF]
[ABC, DEF, G AND H]</pre>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">
(defun quibble (&rest args)
(format t "{~{~a~#[~; and ~:;, ~]~}}" args))
Line 1,144 ⟶ 1,362:
(quibble "ABC" "DEF")
(quibble "ABC" "DEF" "G" "H")
</syntaxhighlight>
</lang>
{{out}}
<pre>{}
Line 1,152 ⟶ 1,370:
 
=={{header|Cowgol}}==
<langsyntaxhighlight lang="cowgol">include "cowgol.coh";
 
sub quibble(words: [[uint8]],
Line 1,193 ⟶ 1,411:
print(quibble(&w3[0], @sizeof w3, LOMEM)); print_nl();
print(quibble(&w4[0], @sizeof w4, LOMEM)); print_nl();
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,203 ⟶ 1,421:
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.string;
 
string quibbler(in string[] seq) pure /*nothrow*/ {
Line 1,219 ⟶ 1,437:
["ABC", "DEF", "G", "H"]])
test.quibbler.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>{}
Line 1,227 ⟶ 1,445:
 
===Alternative Version===
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.algorithm, std.conv, std.array;
 
enum quibbler = (in string[] a) pure =>
Line 1,236 ⟶ 1,454:
[[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]]
.map!quibbler.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>["{}", "{ABC}", "{ABC and DEF}", "{ABC, DEF, G and H}"]</pre>
 
=={{header|dc}}==
<syntaxhighlight lang="dc">[(q)uibble: main entry point. print brackets, calling n in between if stack not
empty.]sx
[ [{]n z 0 !=n [}]pR ]sq
 
[(n)onempty: if more than 1 item, call m. then print top of stack.]sx
[ z 1 !=m n ]sn
 
[(m)ore: call f to flip stack into r register, call p to print most of it,
then pop the last item back onto the main stack so it's there to be printed
after we return]sx
[ lfx lpx Lr ]sm
 
[(f)lip: utility routine to reverse the stack into the r register]sx
[ Sr z 0 !=f ]sf
 
[(p)rint: get next item from stack in r register and print it. If there are
more than 2 items left on the register stack (which never drops below one
item), print a comma (c) and recurse. If there are exactly two items left,
print " and " (a) and return.]sx
[ Lr n 2 yr >c 2 yr =a 2 yr >p]sp
 
[(c)omma: utility routine to print a comma followed by a space]sx
[ [, ]n ]sc
 
[(a)and: utility routine to print " and "]sx
[ [ and ]n ]sa
 
[run tests]sx
lqx
[ABC] lqx
[ABC] [DEF] lqx
[ABC] [DEF] [G] [H] lqx</syntaxhighlight>
 
{{out}}
<pre>{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|DCL}}==
<langsyntaxhighlight DCLlang="dcl">$ list = "[]"
$ gosub comma_quibbling
$ write sys$output return_string
Line 1,276 ⟶ 1,534:
$ done2:
$ return_string = return_string + "}"
$ return</langsyntaxhighlight>
{}out}}
<pre>$ @comma_quibbling
Line 1,283 ⟶ 1,541:
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|Delphi}}==
See [[#Pascal|Pascal]].
=={{header|Déjà Vu}}==
<langsyntaxhighlight lang="dejavu">comma-quibble lst:
"}" )
if lst:
Line 1,300 ⟶ 1,559:
!. comma-quibble [ "ABC" ]
!. comma-quibble [ "ABC" "DEF" ]
!. comma-quibble [ "ABC" "DEF" "G" "H" ]</langsyntaxhighlight>
{{out}}
<pre>"{}"
Line 1,306 ⟶ 1,565:
"{ABC and DEF}"
"{ABC, DEF, G and H}"</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight>
func$ tolist s$ .
s$[] = strsplit s$ " "
r$ = "{"
n = len s$[]
for i = 1 to n - 2
r$ &= s$[i] & ", "
.
if n > 0
if n > 1
r$ &= s$[n - 1] & " and "
.
r$ &= s$[n]
.
r$ &= "}"
return r$
.
print tolist ""
print tolist "ABC"
print tolist "ABC DEF"
print tolist "ABC DEF G H"
</syntaxhighlight>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
(lib 'match)
 
Line 1,329 ⟶ 1,612:
("ABC" "DEF") ----> "{ ABC and DEF }"
("ABC" "DEF" "G" "H") ----> "{ ABC, DEF, G and H }"
</syntaxhighlight>
</lang>
 
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
APPLICATION
Line 1,380 ⟶ 1,663:
 
end
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,391 ⟶ 1,674:
=={{header|Elixir}}==
{{trans|Erlang}}
<langsyntaxhighlight lang="elixir">defmodule RC do
def generate( list ), do: "{#{ generate_content(list) }}"
Line 1,406 ⟶ 1,689:
Enum.each([[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]], fn list ->
IO.inspect RC.generate(list)
end)</langsyntaxhighlight>
 
{{out}}
Line 1,417 ⟶ 1,700:
 
=={{header|Erlang}}==
<syntaxhighlight lang="text">
-module( comma_quibbling ).
 
Line 1,435 ⟶ 1,718:
With_commas = [X ++ "," || X <- T],
string:join(lists:reverse([Last, "and", Second_to_last | With_commas]), " ").
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,442 ⟶ 1,725:
</pre>
 
=={{header|F_Sharp|F#}}==
===One Way===
<langsyntaxhighlight lang="fsharp">let quibble list =
let rec inner = function
| [] -> ""
Line 1,457 ⟶ 1,740:
quibble ["ABC"; "DEF"]
quibble ["ABC"; "DEF"; "G"]
quibble ["ABC"; "DEF"; "G"; "H"]</langsyntaxhighlight>
Output from testing (in F# Interactive 3.0, Open Source version):
<syntaxhighlight lang="text">
> quibble [];;
val it : string = "{}"
Line 1,469 ⟶ 1,752:
val it : string = "{ABC, DEF and G}"
> quibble ["ABC"; "DEF"; "G"; "H"];;
val it : string = "{ABC, DEF, G and H}"</langsyntaxhighlight>
===or Another===
====The Function====
<langsyntaxhighlight lang="fsharp">
let quibble quibbler quibblee = Seq.zip quibblee quibbler //Sorry, just too good a line to miss, back in my Latin classes
</syntaxhighlight>
</lang>
====The Task====
<langsyntaxhighlight lang="fsharp">
let fN n = quibble (List.mapi(fun n _->match n with 0->"" |1-> " and " |_->", ") n |> List.rev) n
printf "{"; fN ["ABC"; "DEF"; "G"; "H"] |> Seq.iter(fun(n,g)->printf "%s%s" n g); printfn"}"
Line 1,483 ⟶ 1,766:
printf "{"; fN ["ABC"] |> Seq.iter(fun(n,g)->printf "%s%s" n g); printfn"}"
printf "{"; fN [] |> Seq.iter(fun(n,g)->printf "%s%s" n g); printfn"}"
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,495 ⟶ 1,778:
=={{header|Factor}}==
This example uses the <code>inverse</code> vocabulary, which builds on the concept of invertible quotations as the basis for pattern matching. It is discussed at length in this approachable [http://micsymposium.org/mics_2009_proceedings/mics2009_submission_72.pdf paper].
<langsyntaxhighlight lang="factor">USING: inverse qw sequences ;
: (quibble) ( seq -- seq' )
Line 1,508 ⟶ 1,791:
 
{ } qw{ ABC } qw{ ABC DEF } qw{ ABC DEF G H }
[ quibble print ] 4 napply</langsyntaxhighlight>
{{out}}
<pre>
Line 1,519 ⟶ 1,802:
=={{header|Forth}}==
The efficient and beautiful way to solve the task is to keep a sliding triplet of consequent words. First we unconditionally read the first two words; if there are none, "read" gives us an empty word. Then we read the input stream, typing third to last word together with a comma. When the loop ends, we have two (possible empty) words on the stack, and the only thing left to do is to output it accordingly.
<syntaxhighlight lang="text">
: read bl parse ;
: not-empty? ( c-addr u -- c-addr u true | false ) ?dup-if true else drop false then ;
Line 1,536 ⟶ 1,819:
quibble ABC DEF
quibble ABC DEF G H
</syntaxhighlight>
</lang>
 
=={{header|Fortran}}==
Line 1,543 ⟶ 1,826:
Subroutine QUIBBLE doesn't have to worry about this because it works with TEXT as a parameter, whatever its size (various integer limits apply) however, it too has the same problem because it locates the start and end positions of each word, and, how many words are going to be found? So once again, the arrays are made "surely large enough" for the expected class of problem. The first stage is to locate the words separated by any amount of "white space", which, thanks to the inability to rely on the evaluation of compound boolean expressions (of the form <code>IF (''in bounds'' & ''Array indexing'')</code>) in the "shortcut" manner, employs a battery of IF-statements. Fortran does not offer a data type "list of ..." so there is no prospect of placing the words into such an entity then inserting commas and "and" elements into the list to taste. Instead, the list of words is represented by a sequence of values in ordinary arrays.
 
The source style is Fortran 77, thus the use of COMMON to pass some I/O unit numbers. The plan initially was to engage in trickery with the variable FORMAT features, of the form <''expression''>(blah blah) to signify some number of repetitions of (blah blah), which number might be ''zero'', but alas, although <0>X works, it proved not to work for grouped items in place of a format code. So the <..> extension had to be abandoned, and plainer F77 results.<langsyntaxhighlight Fortranlang="fortran"> SUBROUTINE QUIBBLE(TEXT,OXFORDIAN) !Punctuates a list with commas and stuff.
CHARACTER*(*) TEXT !The text, delimited by spaces.
LOGICAL OXFORDIAN !Just so.
Line 1,608 ⟶ 1,891:
 
Closedown
30 END !All files are closed by exiting.</langsyntaxhighlight>
Output:
<pre>
Line 1,625 ⟶ 1,908:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">
' FB 1.05.0 Win64
 
Line 1,684 ⟶ 1,967:
Print "Press any key to quit the program"
Sleep
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,692 ⟶ 1,975:
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
=={{header|Frink}}==
<syntaxhighlight lang="frink">quibble[enum] :=
{
list = toArray[enum] // This makes it work on any enumerating expression
size = length[list]
if size >= 2
return "{" + join[", ", first[list, size-1]] + " and " + last[list] + "}"
else
return "{" + join["", list] + "}"
}
 
data = [[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]]
for line = data
println[quibble[line]]</syntaxhighlight>
{{out}}
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
 
 
=={{header|FutureBasic}}==
Long solution:
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
local fn CommaQuibber( string as CFStringRef ) as CFStringRef
CFStringRef tempStr
NSUInteger i
tempStr = fn StringByReplacingOccurrencesOfString( string, @"[", @"" )
tempStr = fn StringByReplacingOccurrencesOfString( tempStr, @"]", @"" )
tempStr = fn StringByReplacingOccurrencesOfString( tempStr, @" ", @"" )
tempStr = fn StringByReplacingOccurrencesOfString( tempStr, @"\"", @"" )
CFMutableStringRef quibStr = fn MutableStringWithCapacity(0)
CFArrayRef arr = fn StringComponentsSeparatedByString( tempStr, @"," )
NSUInteger count = len(arr)
select switch ( count )
case 0 : MutableStringSetString( quibStr, @"{}" ) : break
case 1 : MutableStringSetString( quibStr, fn StringWithFormat( @"{%@}", arr[0] ) ) : break
case 2 : MutableStringSetString( quibStr, fn StringWithFormat( @"{%@ and %@}", arr[0], arr[1] ) ) : break
case else
MutableStringAppendFormat( quibStr, @"{" )
for i = 0 to count -1
if ( i != count -1 )
MutableStringAppendFormat( quibStr, @"%@, ", arr[i] )
else
MutableStringAppendFormat( quibStr, @"and %@}", arr[i] )
end if
next
end select
end fn = quibStr
 
NSLog( @"%@", fn CommaQuibber( @"[]" ) )
NSLog( @"%@", fn CommaQuibber( @"[\"ABC\"]" ) )
NSLog( @"%@", fn CommaQuibber( @"[\"ABC\", \"DEF\"]" ) )
NSLog( @"%@", fn CommaQuibber( @"[\"ABC\", \"DEF\", \"G\", \"H\"]" ) )
 
HandleEvents
</syntaxhighlight>
Short solution:
<syntaxhighlight lang="futurebasic">
local fn CommaQuibbler( s as CFArrayRef ) as CFStringRef
CFStringRef result = NULL
select ( len(s) )
case 0: exit fn = @"{}"
case 1: exit fn = fn StringWithFormat( @"{%@}", s[0] )
case 2: exit fn = fn StringWithFormat( @"{%@ and %@}", s[0], s[1] )
case else
result = fn StringWithFormat( @"{%@}", fn ArrayComponentsJoinedByString( s, @", " ) )
CFRange lastComma = fn StringRangeOfStringWithOptions( result, @",", NSBackwardsSearch )
result = fn StringByReplacingCharactersInRange( result, lastComma, @" and" )
end select
end fn = result
 
print fn CommaQuibbler( @[] )
print fn CommaQuibbler( @[@"ABC"] )
print fn CommaQuibbler( @[@"ABC", @"DEF"] )
print fn CommaQuibbler( @[@"ABC", @"DEF", @"G", @"H"] )
 
HandleEvents
</syntaxhighlight>
{{output}}
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G, and H}
</pre>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=8edc63b206a1de50dd104cd12486ac03 Click this link to run this code]'''
<langsyntaxhighlight lang="gambas">Public Sub Main()
Dim sInput As String[] = ["", "ABC", "ABC DEF", "ABC DEF G H"]
Dim sTemp As String
Line 1,710 ⟶ 2,087:
Next
 
End</langsyntaxhighlight>
Output:
<pre>
Line 1,721 ⟶ 2,098:
=={{header|Go}}==
The blog mentioned code maintenence. The idea here is to make the code easy for maintainers to understand by making it correspond as directly as possible to the problem description.
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,750 ⟶ 2,127:
fmt.Println(q([]string{"ABC", "DEF"}))
fmt.Println(q([]string{"ABC", "DEF", "G", "H"}))
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,760 ⟶ 2,137:
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def commaQuibbling = { it.size() < 2 ? "{${it.join(', ')}}" : "{${it[0..-2].join(', ')} and ${it[-1]}}" }</langsyntaxhighlight>
'''Testing:'''
<langsyntaxhighlight lang="groovy">['{}': [], '{ABC}': ['ABC'], '{ABC and DEF}': ['ABC', 'DEF'], '{ABC, DEF, G and H}': ['ABC', 'DEF', 'G', 'H']].each { expected, input ->
println "Verifying commaQuibbling($input) == $expected"
assert commaQuibbling(input) == expected
}</langsyntaxhighlight>
{{out}}
<pre>Verifying commaQuibbling([]) == {}
Line 1,773 ⟶ 2,150:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">quibble ws = "{" ++ quibbles ws ++ "}"
where quibbles [] = ""
quibbles [a] = a
Line 1,782 ⟶ 2,159:
[[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]] ++
(map words ["One two three four", "Me myself I", "Jack Jill", "Loner" ])
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,796 ⟶ 2,173:
 
Or, defining just two cases, and drawing more on standard libraries than on hand-crafted pattern-matching and recursion:
<langsyntaxhighlight Haskelllang="haskell">import Data.List (intercalate)
 
--------------------- COMMA QUIBBLING --------------------
 
quibble :: [String] -> String
quibble ws@(_ : _ : _) =
intercalate
| length ws > 1 =
intercalate" and "
( [intercalate ", " . reverse . tail, head]
" and "
([intercalate ", " . reverse . tail, head] <*> [reverse ws])
)
| otherwise = concat ws
quibble xs = concat xs
 
--------------------------- TEST -------------------------
main :: IO ()
main =
mapM_ (putStrLn . (`intercalate` ["{", "}"]) . quibble) $
[[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]] ++
<> ( words
(words <$> ["One two three four", "Me myself I", "Jack Jill", "Loner"])
<$> [ "One two three four",
</lang>
"Me myself I",
"Jack Jill",
"Loner"
]
)</syntaxhighlight>
{{Out}}
<pre>{}
Line 1,825 ⟶ 2,211:
 
The following works in both languages:
<langsyntaxhighlight lang="unicon">procedure main()
every write(quibble([] | ["ABC"] | ["ABC","DEF"] | ["ABC","DEF","G","H"]))
end
Line 1,833 ⟶ 2,219:
while s := pull(A)||join||s do join := if *join = 0 then " and " else ", "
return "{"||s||"}"
end</langsyntaxhighlight>
 
Sample run:
Line 1,847 ⟶ 2,233:
 
=={{header|J}}==
<langsyntaxhighlight lang="j">quibLast2=: ' and ' joinstring (2 -@<. #) {. ]
withoutLast2=: ([: # _2&}.) {. ]
quibble=: '{', '}' ,~ ', ' joinstring withoutLast2 , <@quibLast2</langsyntaxhighlight>
 
'''Testing:'''
<langsyntaxhighlight lang="j"> Tests=: (<'');(<'ABC'<3);{('ABC';'DEF'i.5)<@{."0 1;<(:'ABC';' DEF';' G';' H')
quibble every Tests
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}</langsyntaxhighlight>
 
Alternative implementation:
 
<langsyntaxhighlight lang="j">commaand=: 1 ;@}.&, ] ,.~ 1 |.!.(<' and ') (<', ')"0
quibble=: '{','}',~ commaand</langsyntaxhighlight>
 
(same results)
 
=={{header|Java}}==
<langsyntaxhighlight Javalang="java">public class Quibbler {
 
public static String quibble(String[] words) {
Line 1,887 ⟶ 2,273:
System.out.println(quibble(new String[]{"ABC", "DEF", "G", "H"}));
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,898 ⟶ 2,284:
=={{header|JavaScript}}==
===ES5===
<langsyntaxhighlight lang="javascript">function quibble(words) {
return "{" +
words.slice(0, words.length-1).join(",") +
Line 1,910 ⟶ 2,296:
console.log(quibble(s));
}
);</langsyntaxhighlight>
{{out}}
<pre>{}
Line 1,921 ⟶ 2,307:
{{Trans|Haskell}}
Composing from a set of generic functions:
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict';
 
Line 2,061 ⟶ 2,447:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>{}
Line 2,073 ⟶ 2,459:
 
Alternative implementation:
<syntaxhighlight lang="javascript">
<lang JavaScript>
function quibble(words) {
var words2 = words.join()
Line 2,083 ⟶ 2,469:
return '{'+words4+'}';
}
</syntaxhighlight>
</lang>
 
=={{header|jq}}==
{{works with|jq|1.4}}
<langsyntaxhighlight lang="jq">def quibble:
if length == 0 then ""
elif length == 1 then .[0]
else (.[0:length-1] | join(", ")) + " and " + .[length-1]
end
| "{" + . + "}";</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="jq">( [], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]) | quibble</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight lang="sh">jq -n -r -f Comma_quibbling.jq
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}
</syntaxhighlight>
</lang>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
<langsyntaxhighlight Julialang="julia">function quibble(arr::Array)
if isempty(arr) rst = "" else rst = "$(arr[end])" end
if length(arr) > 1 rst = join(arr[1:end-1], ", ") * " and " * rst end
Line 2,114 ⟶ 2,500:
@show quibble(["ABC"])
@show quibble(["ABC", "DEF"])
@show quibble(["ABC", "DEF", "G", "H"])</langsyntaxhighlight>
 
{{Out}}
Line 2,123 ⟶ 2,509:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
fun commaQuibble(s: String): String {
Line 2,148 ⟶ 2,534:
)
for (input in inputs) println("${input.padEnd(24)} -> ${commaQuibble(input)}")
}</langsyntaxhighlight>
 
{{out}}
Line 2,156 ⟶ 2,542:
["ABC", "DEF"] -> {ABC and DEF}
["ABC", "DEF", "G", "H"] -> {ABC, DEF, G and H}
</pre>
 
=={{header|Lang}}==
<syntaxhighlight lang="lang">
fp.quibble = (&words) -> {
$len $= @&words
$output = \{\e
$i
repeat($[i], $len) {
$output += &words[$i] ||| ($i == -|$len?\e:($i == $len - 2?\sand\s:\,\s))
}
$output += \}\e
return $output
}
 
fn.println(fp.quibble(fn.arrayOf()))
fn.println(fp.quibble(fn.arrayOf(ABC)))
fn.println(fp.quibble(fn.arrayOf(ABC, DEF)))
fn.println(fp.quibble(fn.arrayOf(ABC, DEF, G, H)))
</syntaxhighlight>
 
{{out}}
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">#!/usr/bin/lasso9
 
local(collection =
Line 2,181 ⟶ 2,598:
}
 
}</langsyntaxhighlight>
 
Output:
Line 2,191 ⟶ 2,608:
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
<lang lb>
do
read in$
Line 2,236 ⟶ 2,653:
 
data "END" 'Sentinel for EOD.
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,246 ⟶ 2,663:
 
=={{header|Logo}}==
<langsyntaxhighlight Logolang="logo">to join :delimiter :list [:result []]
output cond [
[ [empty? :list] :result ]
Line 2,271 ⟶ 2,688:
]
 
bye</langsyntaxhighlight>
{{out}}
<pre>{}
Line 2,280 ⟶ 2,697:
 
=={{header|Lua}}==
<langsyntaxhighlight Lualang="lua">function quibble (strTab)
local outString, join = "{"
for strNum = 1, #strTab do
Line 2,301 ⟶ 2,718:
{"ABC", "DEF", "G", "H"}
}
for _, input in pairs(testCases) do print(quibble(input)) end</langsyntaxhighlight>
{{out}}
<pre>{}
Line 2,310 ⟶ 2,727:
=={{header|M2000 Interpreter}}==
===Using string as argument===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
function f$ {
Line 2,338 ⟶ 2,755:
}
Checkit
</syntaxhighlight>
</lang>
 
===Using String functions only===
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
function f$ {
Line 2,357 ⟶ 2,774:
}
Checkit
</syntaxhighlight>
</lang>
 
===Using array as argument===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
function f$(ar) {
Line 2,384 ⟶ 2,801:
}
Checkit
</syntaxhighlight>
</lang>
{{out}}
<pre >
Line 2,394 ⟶ 2,811:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">Quibble := proc( los )
uses StringTools;
Fence( proc()
Line 2,405 ⟶ 2,822:
end if
end(), "{", "}" )
end proc:</langsyntaxhighlight>
 
Check it on the required inputs:
<langsyntaxhighlight Maplelang="maple">> Quibble([]);
"{}"
 
Line 2,419 ⟶ 2,836:
> Quibble( ["ABC", "DEF", "G", "H"] );
"{ABC, DEF, G and H}"
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">quibble[words___] :=
ToString@{StringJoin@@
Replace[Riffle[{words}, ", "],
{most__, ", ", last_} -> {most, " and ", last}]}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,443 ⟶ 2,860:
=={{header|MATLAB}} / {{header|Octave}}==
 
<syntaxhighlight lang="matlab">
<lang Matlab>
function r = comma_quibbling(varargin)
if isempty(varargin)
Line 2,456 ⟶ 2,873:
end
end;
</syntaxhighlight>
</lang>
 
 
Line 2,474 ⟶ 2,891:
 
=={{header|MAXScript}}==
<syntaxhighlight lang="maxscript">
<lang MAXScript>
fn separate words: =
(
Line 2,498 ⟶ 2,915:
)
)
</syntaxhighlight>
</lang>
Output:
<syntaxhighlight lang="maxscript">
<lang MAXScript>
separate words:#()
"{}"
Line 2,509 ⟶ 2,926:
separate words:#("ABC","DEF","G","H")
"{ABC, DEF, G and H}"
</syntaxhighlight>
</lang>
 
=={{header|Miranda}}==
<syntaxhighlight lang="miranda">main :: [sys_message]
main = [Stdout (show test ++ ": {" ++ quibble test ++ "}\n") | test <- tests]
 
tests :: [[[char]]]
tests = [ [],
["ABC"],
["ABC","DEF"],
["ABC","DEF","G","H"] ]
 
quibble :: [[char]]->[char]
quibble [] = []
quibble [word] = word
quibble [word1,word2] = word1 ++ " and " ++ word2
quibble (word:words) = word ++ ", " ++ quibble words</syntaxhighlight>
{{out}}
<pre>[]: {}
["ABC"]: {ABC}
["ABC","DEF"]: {ABC and DEF}
["ABC","DEF","G","H"]: {ABC, DEF, G and H}</pre>
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 2,537 ⟶ 2,974:
end lst
return
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,547 ⟶ 2,984:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc commaQuibble(s: openArray[string]): string =
result = ""
for i, c in s:
Line 2,556 ⟶ 2,993:
var s = @[@[], @["ABC"], @["ABC", "DEF"], @["ABC", "DEF", "G", "H"]]
for i in s:
echo commaQuibble(i)</langsyntaxhighlight>
 
=={{header|Oberon-2}}==
{{works with|oo2c}}
<langsyntaxhighlight lang="oberon2">
MODULE CommaQuibbling;
IMPORT
Line 2,606 ⟶ 3,043:
Out.String(":> ");Out.String(str);Out.Ln
END CommaQuibbling.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,623 ⟶ 3,060:
=={{header|Objeck}}==
 
<langsyntaxhighlight lang="objeck">class Quibbler {
function : Quibble(words : String[]) ~ String {
text := "{";
Line 2,654 ⟶ 3,091:
Quibble(words)->PrintLine();
}
}</langsyntaxhighlight>
 
Output:
Line 2,666 ⟶ 3,103:
=={{header|OCaml}}==
 
<langsyntaxhighlight lang="ocaml">open Printf
 
let quibble list =
Line 2,682 ⟶ 3,119:
["ABC"; "DEF"];
["ABC"; "DEF"; "G"; "H"]]
|> List.iter (fun list -> print_endline (quibble list))</langsyntaxhighlight>
 
{{works with|Core|v0.9.116.03+91}}
<langsyntaxhighlight lang="ocaml">open Core
 
let quibble = function
Line 2,699 ⟶ 3,136:
[|"ABC"; "DEF"|];
[|"ABC"; "DEF"; "G"; "H"|]]
|> List.iter ~f:(fun list -> print_endline (quibble list))</langsyntaxhighlight>
 
{{out}}
Line 2,711 ⟶ 3,148:
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">: quibbing(l) -- string
| i s |
StringBuffer new "{" <<
Line 2,719 ⟶ 3,156:
i s == ifTrue: [ " and " << ]
]
"}" << dup freeze ; </langsyntaxhighlight>
 
{{out}}
Line 2,728 ⟶ 3,165:
 
=={{header|Ol}}==
<langsyntaxhighlight lang="scheme">
(define (quibble . args)
(display "{")
Line 2,748 ⟶ 3,185:
(quibble "ABC" "DEF")
(quibble "ABC" "DEF" "G" "H")
</syntaxhighlight>
</lang>
 
{{out}}
Line 2,760 ⟶ 3,197:
=={{header|PARI/GP}}==
 
<langsyntaxhighlight lang="parigp">comma(v)={
if(#v==0, return("{}"));
if(#v==1, return(Str("{"v[1]"}")));
Line 2,770 ⟶ 3,207:
comma(["ABC"])
comma(["ABC", "DEF"])
comma(["ABC", "DEF", "G", "H"])</langsyntaxhighlight>
Output:
<pre>%1 = "{}"
Line 2,779 ⟶ 3,216:
=={{header|Pascal}}==
 
<syntaxhighlight lang="pascal">
<Lang Pascal>
program CommaQuibbling;
 
Line 2,913 ⟶ 3,350:
writeln(Quibble.CommaQuibble);
end;
end.</Langsyntaxhighlight>
Output:
<Pre>
Line 2,928 ⟶ 3,365:
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">sub comma_quibbling :prototype(@) {
return "{$_}" for
@_ < 2 ? "@_" :
Line 2,935 ⟶ 3,372:
 
print comma_quibbling(@$_), "\n" for
[], [qw(ABC)], [qw(ABC DEF)], [qw(ABC DEF G H)];</langsyntaxhighlight>
{{out}}
<pre>{}
Line 2,944 ⟶ 3,381:
'''Perl 5.01 version and other approach:'''
 
<langsyntaxhighlight lang="perl">use 5.01;
sub comma_quibbling {
my $last = pop // '';
return '{'. (@_ ? (join ', ', @_).' and '.$last : $last).'}';
Line 2,951 ⟶ 3,388:
 
say for map {comma_quibbling(@$_)}
[], [qw(ABC)], [qw(ABC DEF)], [qw(ABC DEF G H)];</langsyntaxhighlight>
{{out}}
<pre>{}
Line 2,959 ⟶ 3,396:
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">quibble</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">words</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
Line 2,975 ⟶ 3,412:
<span style="color: #0000FF;">?</span><span style="color: #000000;">quibble</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,986 ⟶ 3,423:
=={{header|PHP}}==
 
<langsyntaxhighlight lang="php"><?php
 
function quibble($arr) {
 
$words = switch (count($arr);) {
 
case 0:
if($words == 0){
return '{}';
 
}elseif($words == 1){
case 1:
return '{'.$arr[0].'}';
return "{{$arr[0]}}";
}elseif($words == 2){
 
return '{'.$arr[0].' and '.$arr[1].'}';
default:
}else{
return '{'. $left = implode(', ', array_splicearray_slice($arr, 0, -1) ). ' and '.$arr[0].'}';
$right = array_slice($arr, -1)[0];
}
return "{{$left} and {$right}}";
 
}
 
}
Line 3,014 ⟶ 3,454:
foreach ($tests as $test) {
echo quibble($test) . PHP_EOL;
}
}</lang>
?></syntaxhighlight>
{{out}}
<pre>{}
Line 3,022 ⟶ 3,463:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(for L '([] ["ABC"] ["ABC", "DEF"] ["ABC", "DEF", "G", "H"])
(let H (head -1 L)
(prinl
Line 3,029 ⟶ 3,470:
(and H " and ")
(last L)
"}" ) ) )</langsyntaxhighlight>
Output:
<pre>{}
Line 3,037 ⟶ 3,478:
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">*process or(!);
quib: Proc Options(main);
/*********************************************************************
Line 3,082 ⟶ 3,523:
Return('{'!!result!!'}');
End;
End;</langsyntaxhighlight>
{{out}}
<pre>
Line 3,092 ⟶ 3,533:
 
=={{header|PL/M}}==
<langsyntaxhighlight lang="plm">100H:
 
/* COPY A STRING (MINUS TERMINATOR), RETURNS LENGTH (MINUS TERMINATOR) */
Line 3,165 ⟶ 3,606:
CALL BDOS(BDOS$EXIT, 0);
EOF</langsyntaxhighlight>
{{out}}
 
Line 3,174 ⟶ 3,615:
 
=={{header|Plain English}}==
<langsyntaxhighlight lang="plainenglish">To quibble four words:
Add "ABC" to some string things.
Add "DEF" to the string things.
Line 3,217 ⟶ 3,658:
Quibble four words.
Wait for the escape key.
Shut down.</langsyntaxhighlight>
{{out}}
<pre>
Line 3,227 ⟶ 3,668:
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Out-Quibble
{
Line 3,269 ⟶ 3,710:
"{" + $outStr -f $text + "}"
}
</syntaxhighlight>
</lang>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Out-Quibble
Out-Quibble "ABC"
Out-Quibble "ABC", "DEF"
Out-Quibble "ABC", "DEF", "G", "H"
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,284 ⟶ 3,725:
</pre>
What it might look like when working with a file:
<syntaxhighlight lang="powershell">
<lang PowerShell>
$file = @'
 
Line 3,296 ⟶ 3,737:
Out-Quibble -Text ($line -split ", ")
}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,309 ⟶ 3,750:
{{works with|SWI-Prolog|7.1}}
 
<langsyntaxhighlight lang="prolog">words_series(Words, Bracketed) :-
words_serialized(Words, Serialized),
atomics_to_string(["{",Serialized,"}"], Bracketed).
Line 3,326 ⟶ 3,767:
( words_series(Words, Series),
format('~w ~15|=> ~w~n', [Words, Series]))
).</langsyntaxhighlight>
 
{{Out}}
<langsyntaxhighlight lang="prolog">?- test.
[] => {}
[ABC] => {ABC}
[ABC,DEF] => {ABC and DEF}
[ABC,DEF,G,H] => {ABC, DEF, G and H}
true.</langsyntaxhighlight>
 
=={{header|PureBasic}}==
<syntaxhighlight lang="purebasic">
<lang PureBasic>
EnableExplicit
 
Line 3,372 ⟶ 3,813:
CloseConsole()
EndIf
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,387 ⟶ 3,828:
hence the replace is done on the reverse of the intermediate string
then reversed back.
<langsyntaxhighlight lang="python">>>> def strcat(sequence):
return '{%s}' % ', '.join(sequence)[::-1].replace(',', 'dna ', 1)[::-1]
 
Line 3,398 ⟶ 3,839:
Input: ['ABC', 'DEF'] -> Output: '{ABC and DEF}'
Input: ['ABC', 'DEF', 'G', 'H'] -> Output: '{ABC, DEF, G and H}'
>>> </langsyntaxhighlight>
 
===Python: Counted replacement===
Line 3,404 ⟶ 3,845:
replace() will replace nothing if the count of items to replace is zero, (and negative integer counts act to replace all occurrences).
This combines with the length of the input sequence to allow this to work:
<langsyntaxhighlight lang="python">def commaQuibble(s):
return '{%s}' % ' and '.join(s).replace(' and ', ', ', len(s) - 2)
 
for seq in ([], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]):
print('Input: %-24r -> Output: %r' % (seq, commaQuibble(seq)))</langsyntaxhighlight>
 
{{out}}
Line 3,417 ⟶ 3,858:
 
===Python: Functional===
<langsyntaxhighlight lang="python">>>> def quibble(s):
return ('{' +
(', '.join(s[:-1]) + ' and ' if len(s) > 1 else '') +
Line 3,431 ⟶ 3,872:
Input: ['ABC', 'DEF'] -> Output: '{ABC and DEF}'
Input: ['ABC', 'DEF', 'G', 'H'] -> Output: '{ABC, DEF, G and H}'
>>> </langsyntaxhighlight>
 
=={{header|Quackery}}==
<langsyntaxhighlight lang="quackery">[ swap join join ] is glue ( [ [ [ --> [ )
 
[ [ dup size
Line 3,449 ⟶ 3,890:
$ 'ABC' nest$ quibble echo$ cr
$ 'ABC DEF' nest$ quibble echo$ cr
$ 'ABC DEF G H' nest$ quibble echo$</langsyntaxhighlight>
{{out}}
<pre>
Line 3,459 ⟶ 3,900:
 
=={{header|R}}==
<langsyntaxhighlight rlang="rsplus">quib <- function(vect)
{
#The task does not consider empty strings to be words, so we remove them immediately.
#We could also remove non-upper-case characters, but the tasks gives off the impression that the user will do that.
vect <- vect[!nchar(vect) =!= 0]
len <- length(vect)
allButLastWord <- if(len >= 2) paste0(vect[seq_len(len - 1)], collapse = ", ") else ""
if(len == 0) return("{}")
paste0("{", if(nchar(allButLastWord) == 0) vect else paste0(allButLastWord, " and ", vect[len]), "}")
result <- switch(len,
paste0("{", vect, "}"),
paste0("{", vect[1], " and ", vect[2], "}"))
#R's switch for numerics doesn't support default cases, so this next line cannot go in the switch.
if(is.null(result)) paste0("{", paste0(vect[seq_len(len-1)], collapse = ", "), " and ", vect[len], "}") else result
}
quib(character(0)) #R has several types of empty string, e.g. character(0), "", and c("", "", "").
Line 3,481 ⟶ 3,918:
quib(c("ABC", "DEF"))
quib(c("ABC", "DEF", "G", "H"))
quib(c("ABC", "DEF", "G", "H", "I", "J", ""))</langsyntaxhighlight>
{{out}}
<pre>> quib(character(0))
Line 3,505 ⟶ 3,942:
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">(define (quibbling words)
(define (sub-quibbling words)
(match words
Line 3,515 ⟶ 3,952:
 
(for ((input '([] ["ABC"] ["ABC" "DEF"] ["ABC" "DEF" "G" "H"])))
(printf "~s\t->\t~a~%" input (quibbling input)))</langsyntaxhighlight>
{{out}}
<pre>() -> {}
Line 3,524 ⟶ 3,961:
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>sub comma-quibbling(@A) {
<{ }>.join: @A < 2 ?? @A !! "@A[0..*-2].join(', ') and @A[*-1]";
}
 
say comma-quibbling($_) for
[], [<ABC>], [<ABC DEF>], [<ABC DEF G H>];</langsyntaxhighlight>
{{out}}
<pre>{}
Line 3,538 ⟶ 3,975:
=={{header|REBOL}}==
===Straightforward implementation===
<langsyntaxhighlight REBOLlang="rebol">Rebol []
 
comma-quibbling: func [block] [
Line 3,556 ⟶ 3,993:
 
foreach t [[] [ABC] [ABC DEF] [ABC DEF G H]] [print comma-quibbling t]
</syntaxhighlight>
</lang>
{{out}}
<pre>{}
Line 3,563 ⟶ 4,000:
{ABC, DEF, G and H}</pre>
===Alternative (more efficient) version with oxford comma switch===
<langsyntaxhighlight REBOLlang="rebol">Rebol []
 
; builds string instead of using an intermediate block
Line 3,587 ⟶ 4,024:
print "Now with Oxford comma"
foreach t test [print comma-quibbling/oxford t]
</syntaxhighlight>
</lang>
{{out}}
<pre>{}
Line 3,598 ⟶ 4,035:
{ABC and DEF}
{ABC, DEF, G, and H}</pre>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
= <Prout <Quibble>>
<Prout <Quibble ('ABC')>>
<Prout <Quibble ('ABC') ('DEF')>>
<Prout <Quibble ('ABC') ('DEF') ('G') ('H')>>;
};
 
Quibble {
e.X = '{' <Quibble1 e.X> '}';
};
 
Quibble1 {
= ;
(e.Word) = e.Word;
(e.Word1) (e.Word2) = e.Word1 ' and ' e.Word2;
(e.Word) e.Words = e.Word ', ' <Quibble1 e.Words>;
};</syntaxhighlight>
{{out}}
<pre>{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}</pre>
 
=={{header|REXX}}==
===version 1:===
<langsyntaxhighlight lang="rexx">say quibbling('')
say quibbling('ABC')
say quibbling('ABC DEF')
Line 3,615 ⟶ 4,076:
'and' word(list,words(list))
End
Return '{'result'}'</langsyntaxhighlight>
{{out}}
<pre>
Line 3,624 ⟶ 4,085:
</pre>
===version 2:===
<langsyntaxhighlight lang="rexx">say quibbling('')
say quibbling('ABC')
say quibbling('ABC DEF')
Line 3,644 ⟶ 4,105:
result=result 'and' word.wn
End
Return '{'result'}'</langsyntaxhighlight>
{{output}}
<pre>
Line 3,654 ⟶ 4,115:
===version 3:===
{{trans|NetRexx}}
<langsyntaxhighlight Rexxlang="rexx">/* Rexx */
 
i_ = 0
Line 3,677 ⟶ 4,138:
lst = overlay(' ', insert('and', lst, lc), lc)
lst = space(lst, 1) -- remove extra spaces
return '{'lst'}'</langsyntaxhighlight>
{{out}}
<pre>
Line 3,687 ⟶ 4,148:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Comma Quibbling
 
Line 3,729 ⟶ 4,190:
see str + nl
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 3,736 ⟶ 4,197:
{ABC DEF}
{ABC, DEF, G and H}
</pre>
 
=={{header|RPL}}==
Whilst it is always important to ensure overall code clarity for maintenance by using explicit variable names and structured control flows, the spirit of reverse Polish notation programming is to optimize some key part of the algorithm in order to make it as compact - and possibly as fast - as possible, whatever the induced loss of readability. Here, two <code>IFTE</code> low-level instructions are nested to deliver the appropriate liaison substring between two words or before the first word.
{{works with|Halcyon Calc|4.2.7}}
≪ DUP SIZE → words n
≪ "{" 1
'''WHILE''' DUP n ≤ '''REPEAT'''
DUP 1 ≠ OVER n ≠ ", " " and " '''IFTE''' "" '''IFTE'''
ROT SWAP +
words 3 PICK GET +
SWAP 1 +
'''END'''
DROP "}" +
≫ ≫ 'CMAQBL' STO
{{in}}
<pre>
{ } CMAQBL
{ "ABC" } CMAQBL
{ "ABC", "DEF" } CMAQBL
{ "ABC", "DEF", "G", "H" } CMAQBL
</pre>
{{out}}
<pre>
4: "{}"
3: "{ABC}"
2: "{ABC and DEF}"
1: "{ABC, DEF, G and H}"
</pre>
 
=={{header|Ruby}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">def comma_quibbling(a)
%w<{ }>.join(a.length < 2 ? a.first :
"#{a[0..-2].join(', ')} and #{a[-1]}")
Line 3,747 ⟶ 4,236:
[[], %w<ABC>, %w<ABC DEF>, %w<ABC DEF G H>].each do |a|
puts comma_quibbling(a)
end</langsyntaxhighlight>
{{out}}
<pre>{}
Line 3,755 ⟶ 4,244:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">wrds$ = "[]
[""ABC""]
[""ABC"", ""DEF""]
Line 3,772 ⟶ 4,261:
next i
print a$
WEND</langsyntaxhighlight>
{{out}}
<pre>[] ==> {}
Line 3,780 ⟶ 4,269:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">
fn quibble(seq: &[&str]) -> String {
match seq.len() {
Line 3,799 ⟶ 4,288:
println!("{}", quibble(&["ABC", "DEF", "G", "H"]));
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,809 ⟶ 4,298:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def quibble( s:List[String] ) = s match {
case m if m.isEmpty => "{}"
case m if m.length < 3 => m.mkString("{", " and ", "}")
Line 3,821 ⟶ 4,310:
println( quibble( List("ABC","DEF") ) )
println( quibble( List("ABC","DEF","G","H") ) )
}</langsyntaxhighlight>
{{out}}
<pre>{}
Line 3,830 ⟶ 4,319:
=={{header|Scheme}}==
 
<langsyntaxhighlight lang="scheme">
(define (quibble . args)
(display "{")
Line 3,846 ⟶ 4,335:
(quibble "ABC" "DEF")
(quibble "ABC" "DEF" "G" "H")
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,858 ⟶ 4,347:
=={{header|Sed}}==
script-file:
<langsyntaxhighlight lang="sed">s/#.*$//g
y/[/{/
y/]/}/
s/"//g
s/ [A-Z][A-Z]*}/ and&/g
s/, and/ and/</langsyntaxhighlight>
test.txt:
<langsyntaxhighlight lang="text">[] # (No input words).
["ABC"]
["ABC", "DEF"]
["ABC", "DEF", "G", "H"]</langsyntaxhighlight>
sed -f script-file test.txt
{{out}}
Line 3,877 ⟶ 4,366:
 
=={{header|Seed7}}==
<langsyntaxhighlight Seed7lang="seed7">$ include "seed7_05.s7i";
 
const func string: quibble (in array string: input) is func
Line 3,897 ⟶ 4,386:
writeln(quibble([] ("ABC", "DEF")));
writeln(quibble([] ("ABC", "DEF", "G", "H")));
end func;</langsyntaxhighlight>
 
{{out}}
Line 3,908 ⟶ 4,397:
 
=={{header|SenseTalk}}==
<langsyntaxhighlight lang="sensetalk">Quibble [] // (No input words).
Quibble ["ABC"]
Quibble ["ABC", "DEF"]
Line 3,920 ⟶ 4,409:
end if
end Quibble
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,929 ⟶ 4,418:
{ABC, DEF, G and H}
</pre>
=={{header|SETL}}==
<syntaxhighlight lang="setl">program comma_quibbling;
tests := [
[],
["ABC"],
["ABC","DEF"],
["ABC","DEF","G","H"]
];
 
loop for t in tests do
print(t, "=", quibble(t));
end loop;
 
proc quibble(words);
ret := '{';
loop while words /= [] do
word fromb words;
ret +:= word;
case of
(#words = 1):
ret +:= " and ";
(#words > 1):
ret +:= ", ";
end case;
end loop;
return ret + '}';
end proc;
end program;</syntaxhighlight>
{{out}}
<pre>[] = {}
[ABC] = {ABC}
[ABC DEF] = {ABC and DEF}
[ABC DEF G H] = {ABC, DEF, G and H}</pre>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func comma_quibbling(words) {
'{' + ([words.ftfirst(0, -21).join(', ')]-[''] + [words.last] -> join(' and ')) + '}';
}
 
[<>, <ABC>, <ABC DEF>, <ABC DEF G H>].each { |w|
say comma_quibbling(w);
}</langsyntaxhighlight>
{{out}}
<pre>{}
Line 3,944 ⟶ 4,467:
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">local
fun quib [] = ""
| quib [x] = x
Line 3,958 ⟶ 4,481:
val t_quibble_2 = quibble ["ABC", "DEF"] = "{ABC and DEF}"
val t_quibble_3 = quibble ["ABC", "DEF", "G", "H"] = "{ABC, DEF, G and H}"
</syntaxhighlight>
</lang>
 
=={{header|Swift}}==
<langsyntaxhighlight Swiftlang="swift">let inputs = [[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]]
 
func quibbling(var words:[String]) {
Line 3,983 ⟶ 4,506:
for word in inputs {
quibbling(word)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 3,992 ⟶ 4,515:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc commaQuibble {lst} {
return \{[join [lreplace $lst end-1 end [join [lrange $lst end-1 end] " and "]] ", "]\}
}
Line 3,998 ⟶ 4,521:
foreach input { {} {"ABC"} {"ABC" "DEF"} {"ABC" "DEF" "G" "H"} } {
puts [commaQuibble $input]
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,009 ⟶ 4,532:
=={{header|TXR}}==
 
<langsyntaxhighlight lang="txrlisp">(defun quib (list)
(tree-bind (: last . lead) (reverse list)
`{@{(nreverse lead) ", "}@(if lead " and ")@last}`))</langsyntaxhighlight>
 
=={{header|Uiua}}==
{{works with|Uiua|0.10.0-dev.1}}
 
<syntaxhighlight lang="Uiua">
Tests ← {{}
{"ABC"}
{"ABC" "DEF"}
{"ABC" "DEF" "G" "H"}}
Jam ← ◇⊂◇⊂:□
Quibble ← |1 ⟨""◌|°□⊢|Jam" and "°⊟|Quibble⊂⊃(□Jam", "°⊟↙2)(↘2)⟩↧3⧻.
Wrap ← ⊂⊂"{" : "}" Quibble
⍚(&pWrap) Tests
</syntaxhighlight>
 
=={{header|UNIX Shell}}==
{{works with|Bourne Again SHell}}
{{trans|AWK}}
{{works with|Korn Shell}}
<lang bash>quibble() {
{{works with|Z Shell}}
# Here awk(1) is easier than sed(1).
<syntaxhighlight lang="bash">
awk 'BEGIN {
quibble() {
for (i = 1; i < ARGC - 2; i++) s = s ARGV[i] ", "
printf '{'
i = ARGC - 2; if (i > 0) s = s ARGV[i] " and "
i = ARGC - 1; ifwhile (i( $# > 0)2 s = s)); ARGV[i]do
printf "{'%s}\n", s' "$1"
shift
exit 0
done
}' "$@"
if (( $# )); then
}
printf '%s' "$1"
shift
fi
if (( $# )); then
printf ' and %s' "$1"
fi
printf '%s\n' '}'
}</syntaxhighlight>
 
With a slight modification, it will work in any POSIX shell, or even older Bourne-compatible shells as long as they have functions and <b>printf</b>:
 
<syntaxhighlight lang="sh">
quibble() {
printf '{'
while [ $# -gt 2 ]; do
printf '%s, ' "$1"
shift
done
if [ $# -gt 0 ]; then
printf '%s' "$1"
shift
fi
if [ $# -gt 0 ]; then
printf ' and %s' "$1"
fi
printf '%s\n' '}'
}</syntaxhighlight>
 
Going the other way, Zsh-specific code can be more compact:
 
{{works with|Z Shell}}
 
<syntaxhighlight lang="zsh">quibble() {
printf '{'
if (( $# > 1 )) printf '%s and ' ${(j:, :)@[1,-2]}
printf '%s}\n' $@[-1]
}</syntaxhighlight>
 
The test code is the same either way:
<syntaxhighlight lang="sh">
quibble
quibble ABC
quibble ABC DEF
quibble ABC DEF G H</langsyntaxhighlight>
{{out}}
<pre>{}
Line 4,037 ⟶ 4,613:
 
=={{header|VBA}}==
<langsyntaxhighlight lang="vb">Option Explicit
 
Sub Main()
Line 4,052 ⟶ 4,628:
If n > 0 Then s = Left(s, n - 1) & " and " & Right(s, Len(s) - (n + 1))
Quibbling = s
End Function</langsyntaxhighlight>
{{out}}
<pre>{}
Line 4,061 ⟶ 4,637:
 
=={{header|VBScript}}==
<langsyntaxhighlight lang="vb">Function Quibble(s)
arr = Split(s,",")
If s = "" Then
Line 4,087 ⟶ 4,663:
WScript.StdOut.WriteLine
WScript.StdOut.Write Quibble("ABC,DEF,G,H")
WScript.StdOut.WriteLine</langsyntaxhighlight>
{{out}}
<pre>{}
Line 4,098 ⟶ 4,674:
FormatEnumerable() accepts an IEnumerable(Of String), as per Lippert's original specification. FormatArray() contains an alternative implementation for String().
 
<langsyntaxhighlight lang="vbnet">Option Explicit On
Option Infer On
Option Strict On
Line 4,139 ⟶ 4,715:
End Sub
End Module
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,150 ⟶ 4,726:
{ABC, DEF, G and H}
{ABC, DEF, G and H}</pre>
 
=={{header|V (Vlang)}}==
{{trans|go}}
<syntaxhighlight lang="v (vlang)">fn q(s []string) string {
match s.len {
0 {
return '{}'
}
1 {
return '{${s[0]}}'
}
2 {
return '{${s[0]} and ${s[1]}}'
}
else{
return '{${s[0..s.len-1].join(', ')} and ${s[s.len-1]}}'
}
}
}
 
fn main(){
println(q([]))
println(q(['ABC']))
println(q(['ABC','DEF']))
println(q(['ABC','DEF','G','H']))
}</syntaxhighlight>
{{out}}
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
 
=={{header|Wren}}==
<langsyntaxhighlight ecmascriptlang="wren">var quibbling = Fn.new { |w|
var c = w.count
if (c == 0) return "{}"
Line 4,161 ⟶ 4,770:
 
var words = [ [], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"] ]
for (w in words) System.print(quibbling.call(w))</langsyntaxhighlight>
 
{{out}}
Line 4,169 ⟶ 4,778:
{ABC and DEF}
{ABC, DEF, G and H}
</pre>
 
=={{header|XBS}}==
<syntaxhighlight lang="text">func task(a:array){
set x:string="";
foreach(k,v as a){
set out:string="";
if ((k==(?a-2))&((?a)>1)){out=" and "}elif(k!=(?a-1)){out=", "}
x+=v+out;del out;
}
send "{"+x+"}";
}
 
log(task([]));
log(task(["ABC"]));
log(task(["ABC","DEF"]));
log(task(["ABC","DEF","GHI"]));</syntaxhighlight>
{{out}}
<pre>
{}
{ABC}
{ABC and DEF}
{ABC, DEF and GHI}
</pre>
 
=={{header|XLISP}}==
I like the Oxford comma; but specifications are specifications. So this implementation produces the required output by default. It also, however, allows an optional <tt>OXFORD-COMMA</tt> parameter: pass a true value, and you won't find yourself saying things like "I want to thank my parents, Ayn Rand and God".
<langsyntaxhighlight lang="lisp">(defun quibble (inputs &optional oxford-comma)
(define final
(if (and (caddr inputs) oxford-comma)
Line 4,201 ⟶ 4,833:
(print (quibble '("ABC") t))
(print (quibble '("ABC" "DEF") t))
(print (quibble '("ABC" "DEF" "G" "H") t))</langsyntaxhighlight>
{{out}}
<pre>"{}"
Line 4,214 ⟶ 4,846:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes;
 
proc Quibble(N, S);
Line 4,231 ⟶ 4,863:
for I:= 0 to 4 do
if I#3 then [Quibble(I, ["ABC", "DEF", "G", "H"]); CrLf(0)]
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,243 ⟶ 4,875:
=={{header|zkl}}==
This is a cheese ball solution that replies on no commas in the inputs
<langsyntaxhighlight lang="zkl">fcn quib(list){ text:=("{"+list.toString(*)[2,-1]+"}").replace("\"","");
if(list.len()<2) text;
else{
Line 4,249 ⟶ 4,881:
String(text[0,z]," and ",text[z+2,*])
}
}</langsyntaxhighlight>
List.toString("*") converts List(1,2,3) to "L(1,2,3)" with all elements; without the *, long lists are shortened to L(1,2,3,...)
{{out}}
Line 4,260 ⟶ 4,892:
 
=={{header|ZX Spectrum Basic}}==
<langsyntaxhighlight lang="zxbasic">10 DATA 0
20 DATA 1,"ABC"
30 DATA 2,"ABC","DEF"
Line 4,279 ⟶ 4,911:
1090 NEXT i
1100 PRINT "{";s$;"}"
1110 RETURN</langsyntaxhighlight>
1,480

edits