 NB. Inspired by APL work of Eugene McDonnell in 1979
 NB. J translation by Keith Smillie, Comp. Sci, U. Alberta.
 NB. e-mail: K._W._Smillie@mts.ucs.ualberta.ca
 NB. Revised by Eugene McDonnell, 1992
 NB. Additions by L.J.Dickey <ljdickey@watmath.UWaterloo.ca>

 NB. Utilities
   pi		=. >: @ i.
   div		=. <. @ % & 4 100 400
   mod		=. 4 100 400 & |
   dayno	=. 7&|

 NB. Constants
   DAYS		=. ' Su Mo Tu We Th Fr Sa'
   MONTHS	=. 'JanFebMarAprMayJunJulAugSepOctNovDec'
   LENGTHS	=. 31 28 31 30 31 30 31 31 30 31 30 31

 mn	=. _12&{.@]@{&(_3]\MONTHS)	NB. Month name centered
 ly	=. 0&(~:/ . =) @ mod		NB. Leap year test

 NB. Month lengths adjusted for leap year
 LENGTHSadj =. LENGTHS&+@((LENGTHS=28)&(*. ly))@]

 ml	=. {LENGTHSadj			NB. Month length
 nydate	=. >:@(365&*+-/@div)@(]@-&1601)	NB. New Year's date
 odate	=. +/@({.LENGTHSadj)		NB. Ordinal date
 mb	=. -@dayno@(odate+nydate@])	NB. First day of month

 NB. Month calendar without headings
 mctable=. ,"_1@(6 7&$)@(mb |. (42&{.) @ (3&":) @,.@pi@ml)

 mc	=. (mn@[), (DAYS&,@mctable)	NB. Month calendar
 cal	=. (i.@[) mc"0]			NB. Calendar for given number of months
 calendar =. <"2@(4 3&cal)		NB. Calendar with 4 rows & 3 columns

 NB. Additions by L.J.Dickey
 NB. 	calendar 0{6!:0 ''		NB. Calendar for this year.
 NB.	calendar 1+ 0{6!:0 ''		NB. Calendar for next year.
 NB. 	mc ~/ 0 _1 + 2{.6!:0 ''		NB. Calendar for this month.
 NB. 	mc ~/ 2{.6!:0 ''		NB. Calendar for next month.

