Comma quibbling is a task originally set by Eric Lippert in his blog.



Task

Write a function to generate a string output which is the concatenation of input words from a list/sequence where:

 An input of no words produces the output string of just the two brace characters "{}".
 An input of just one word, e.g. ["ABC"], produces the output string of the word inside the two braces, e.g. "{ABC}".
 An input of two words, e.g. ["ABC", "DEF"], produces the output string of the two words inside the two braces with the words separated by the string " and ", e.g. "{ABC and DEF}".
 An input of three or more words, e.g. ["ABC", "DEF", "G", "H"], produces the output string of all but the last word separated by ", " with the last word separated by " and " and all within braces; e.g. "{ABC, DEF, G and H}".


Test your function with the following series of inputs showing your output here on this page:

 [] # (No input words).
 ["ABC"]
 ["ABC", "DEF"]
 ["ABC", "DEF", "G", "H"]


Note: Assume words are non-empty strings of uppercase characters for this task.




*process or(!);
 quib: Proc Options(main);
 /*********************************************************************
 * 06.10.2013 Walter Pachl
 *********************************************************************/
   put Edit*process or(!);
 quib: Proc Options(main);
 /*********************************************************************
 * 06.10.2013 Walter Pachl
 * 07.10.2013 -"- change "Oxford comma" to and
 *********************************************************************/
   put Edit(quibbling(''))(Skip,a);
   put Edit(quibbling('ABC'))(Skip,a);
   put Edit(quibbling('ABC DEF'))(Skip,a);
   put Edit(quibbling('ABC DEF G H'))(Skip,a);
   return;
 
 quibbling: proc(s) Returns(Char(100) Var);
   Dcl s Char(*);
   Dcl result   Char(100) Var Init('');
   Dcl word(10) Char(100) Var;
   Dcl (wi,p) Bin Fixed(31);
   If s='' Then result='';
   Else Do;
     Do wi=1 By 1 While(s^='');
       p=index(s,' ');
       if p=0 Then Do;
         word(wi)=s;
         s='';
         End;
       Else Do;
         word(wi)=left(s,p-1);
         s=substr(s,p+1);
         End;
       end;
     wn=wi-1;
     result=word(1);
     Do i=2 To wn-1;
       result=result!!', '!!word(i);
       End;
     If wn>1 Then
       result=result!!' and '!!word(wn);
     End;
   Return('{'!!result!!'}');
   End;
 End;