 
 (defun ledger-schedule-compile-constraints (descriptor-string)
   "Return a list with the year, month and day fields split"
-  (let ((fields (split-string descriptor-string "[/\\-]" t))
-        constrain-year constrain-month constrain-day)
-    (setq constrain-year (ledger-schedule-constrain-year (nth 0 fields) (nth 1 fields) (nth 2 fields)))
-    (setq constrain-month (ledger-schedule-constrain-month (nth 0 fields) (nth 1 fields) (nth 2 fields)))
-    (setq constrain-day (ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields)))
-
-    (list 'and constrain-year constrain-month constrain-day)))
+  (let ((fields (split-string descriptor-string "[/\\-]" t)))
+		(if (string-match "[A-Za-z]" descriptor-string)
+				(ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields))
+			(list 'and
+						(ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields))
+						(ledger-schedule-constrain-year (nth 0 fields) (nth 1 fields) (nth 2 fields))
+						(ledger-schedule-constrain-month (nth 0 fields) (nth 1 fields) (nth 2 fields))))))
 
 (defun ledger-schedule-constrain-year (year-desc month-desc day-desc)
-  (let ((year-match t))
-    (cond ((string= year-desc "*")
-           year-match)
-          ((/= 0 (setq year-match (string-to-number year-desc)))
-           `(eq (nth 5 (decode-time date)) ,year-match))
-          (t
-           (error "Improperly specified year constraint: %s %s %s" year-desc month-desc day-desc)))))
+	(cond ((string= year-desc "*") t)
+				((/= 0 (string-to-number year-desc))
+				 `(memq (nth 5 (decode-time date)) ',(mapcar 'string-to-number (split-string year-desc ","))))
+				(t
+				 (error "Improperly specified year constraint: %s %s %s" year-desc month-desc day-desc))))
 
 (defun ledger-schedule-constrain-month (year-desc month-desc day-desc)
 	(cond ((string= month-desc "*")

(defun ledger-schedule-constrain-every-count-day (day-of-week skip start-date)
  "Return a form that is true for every DAY skipping SKIP, starting on START.
For example every second Friday, regardless of month."
  (let ((start-day (nth 6 (decode-time (eval start-date)))))
    (if (eq start-day day-of-week)  ;; good, can proceed
        `(zerop (mod (- (time-to-days date) ,(time-to-days (eval start-date))) ,(* skip 7)))
      (error "START-DATE day of week doesn't match DAY-OF-WEEK"))))

(defun ledger-schedule-constrain-date-range (month1 day1 month2 day2)

      xact-list)))

(defun ledger-schedule-read-descriptor-tree (descriptor-string)
	(ledger-schedule-transform-auto-tree (split-string (substring descriptor-string 1 (string-match "]" descriptor-string)) " ")))

(defun ledger-schedule-transform-auto-tree (descriptor-string-list)
  "Takes a lisp list of date descriptor strings, TREE, and returns a string with a lambda function of date."
