A good use of a bad feature

Svante Lindahl zap at duvan.UUCP
Sat May 10 14:37:24 AEST 1986


In article <1298 at umcp-cs.UUCP> jim at umcp-cs.UUCP writes:
>/*
> * xmas.c - a program to print The Twelve Days of Christmas
> * using the C fall thru case statement.
> * If this wasn't my idea, I appologize to whomever I
> * got the idea from, but I wrote the program 5 years
> * ago and I don't remember now. 
[...]
Sorry this isnt' C, but I can't resist posting this... though
I realize this is probably not a very apropriate newsgroup.
It isn't my work, but I've lost track of who wrote it. Anyway
it is an amusing piece of Algol-68-code. Example of execution
under the TOPS-10 OS included after the code.

BEGIN
  PROC readint = INT: (INT i; read(i); i);
  INT  one=1, two=2, three=3, four=4, five=5, six=6,
       seven=7, eight=8, nine=9, ten=10, eleven=11, twelve=12;
  INT  a=one;
  PRIO ME=5, LOVE=7, MY=7, LORDS=7, LADIES=7,
       PIPERS=7, DRUMMERS=7, MAIDS=7, SWANS=7, GEESE=7,
       GOLD=7, COLLY=7, FRENCH=7, TURTLE=7, PARTRIDGE=6;
  BOOL sent to=TRUE;
  OP THE =	(BOOL a)BOOL:a,
     TWELFTH =	(INT a)BOOL: a=twelve,
     ELEVENTH =	(INT a)BOOL: a=eleven,
     TENTH =	(INT a)BOOL: a=ten,
     NINTH =	(INT a)BOOL: a=nine,
     EIGHTH =	(INT a)BOOL: a=eight,
     SEVENTH =	(INT a)BOOL: a=seven,
     SIXTH =	(INT a)BOOL: a=six,
     FIFTH =	(INT a)BOOL: a=five,
     FOURTH =	(INT a)BOOL: a=four,
     THIRD =	(INT a)BOOL: a=three,
     SECOND =	(INT a)BOOL: a=two,
     FIRST =	(INT a)BOOL: a=one;
  OP ME =	(BOOL a, INT b)VOID: (IF a THEN print(b) FI),
     LOVE =	(BOOL a, b)BOOL: (IF a THEN b ELSE FALSE FI),
     MY =	(BOOL a, b)BOOL: a LOVE b,
     AND =	(INT a)INT: a;
  MODE DATE =	STRUCT(INT day, month);
  DATE christmas := (25, 12);
  OP LORDS =	(INT a, b)INT: a*b,
     LADIES =	(INT a, b)INT: a*b,
     PIPERS =	(INT a, b)INT: a*b,
     DRUMMERS =	(INT a, b)INT: a*b,
     MAIDS =	(INT a, b)INT: a*b,
     SWANS =	(INT a, b)INT: a*b,
     GEESE =	(INT a, b)INT: a*b,
     GOLD =	(INT a, b)INT: a*b,
     COLLY =	(INT a, b)INT: a*b,
     FRENCH =	(INT a, b)INT: a*b,
     TURTLE =	(INT a, b)INT: a*b;
  OP LEAPING =	(INT a)INT: a,
     DANCING =	(INT a)INT: a,
     PIPING =	(INT a)INT: a,
     DRUMMING =	(INT a)INT: a,
     MILKING =	(INT a)INT: a,
     SWIMMING =	(INT a)INT: a,
     LAYING =	(INT a)INT: a,
     RINGS =	(INT a)INT: a,
     BIRDS =	(INT a)INT: a,
     HENS =	(INT a)INT: a,
     DOVES =	(INT a)INT: a;
  OP PARTRIDGE = (INT a, b)INT: a+b;
  INT in a pear tree = 0;

  print("Factorial of ");
  print(day OF christmas := readint);
  print(" is ");
  IF day OF christmas > 12 THEN
    print("too big for this program.");
    stop
  FI;

	# Now we are ready.. #

   THE FIRST day OF christmas MY TRUE LOVE sent to ME
  a PARTRIDGE in a pear tree;

    THE SECOND day OF christmas MY TRUE LOVE sent to ME
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE THIRD day OF christmas MY TRUE LOVE sent to ME
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE FOURTH day OF christmas MY TRUE LOVE sent to ME
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE FIFTH day OF christmas MY TRUE LOVE sent to ME
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE SIXTH day OF christmas MY TRUE LOVE sent to ME
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE SEVENTH day OF christmas MY TRUE LOVE sent to ME
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE EIGHTH day OF christmas MY TRUE LOVE sent to ME
  eight MAIDS MILKING
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE NINTH day OF christmas MY TRUE LOVE sent to ME
  nine DRUMMERS DRUMMING
  eight MAIDS MILKING
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE TENTH day OF christmas MY TRUE LOVE sent to ME
  ten PIPERS PIPING
  nine DRUMMERS DRUMMING
  eight MAIDS MILKING
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE ELEVENTH day OF christmas MY TRUE LOVE sent to ME
  eleven LADIES DANCING
  ten PIPERS PIPING
  nine DRUMMERS DRUMMING
  eight MAIDS MILKING
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree;

    THE TWELFTH day OF christmas MY TRUE LOVE sent to ME
  twelve LORDS LEAPING
  eleven LADIES DANCING
  ten PIPERS PIPING
  nine DRUMMERS DRUMMING
  eight MAIDS MILKING
  seven SWANS SWIMMING
  six GEESE LAYING
  five GOLD RINGS
  four COLLY BIRDS
  three FRENCH HENS
  two TURTLE DOVES AND
  a PARTRIDGE in a pear tree

END


.execut xmas
A68:	XMAS
ALGOL68C Release 1.271
Unused space 991

Code generated 8r2271

LINK:	Loading
[LNKXCT	A68 execution]
7
Factorial of            +7 is         +5040

Svante Lindahl, NADA, KTH            Numerical Analysis & Computer Science 
UUCP: {seismo,mcvax}!enea!ttds!zap   Royal Institute of Technology, Sweden
ARPA: enea!ttds!zap at seismo.CSS.GOV   EAN: zap at cs.kth.sunet



More information about the Comp.lang.c mailing list