Nice idea, I suppose it could be made slightly more concise:
(defun c:Mon ( / uMonth uDay uDate uYear uMonthday pMonth uDpos uDdiff )
(setq uMonth (menucmd "M=$(edtime,$(getvar,date),MO\)")
uDay (strcase (menucmd "M=$(edtime,$(getvar,date),DDD\)") t)
uDate (atoi (menucmd "M=$(edtime,$(getvar,date),DD\)"))
uYear (menucmd "M=$(edtime,$(getvar,date),YYYY\)")
)
(setq uMonthday (nth (1+ (atoi uMonth)) '(31 31 28 31 30 31 30 31 31 30 31 30))
pMonth (itoa (1+ (rem (+ 10 (atoi uMonth)) 12))))
(setq uDpos (vl-position uDay '("mon" "tue" "wed" "thu" "fri" "sat" "sun")))
(if (< (setq uDdiff (- uDate uDpos)) 0)
(setq uDate (+ uMonthday uDdiff) uMonth pMonth)
(setq uDate (- uDate uDpos))
)
(alert (strcat "Monday the " (itoa uDate) " of " uMonth " Month " uYear))
(princ)
)