Subject: bug#11272: 24.1.50; `holiday-sexp' not always sufficient

From: Michael Heerdegen <[email-masked]>
Date: Wed, 18 Apr 2012 19:28:52 +0200

Hello,

I wonder why it is currently not possible to have `holiday-sexp' or a
similar function return a _list_ of entries for a given year, instead of
only one (or nil).  Could we provide such a feature?

Some background (just an example): I have a function like this:

(defun sundays-after-trinitatis (year)
  "List of sundays after Trinitatis in year YEAR."
  (let ((i 1)
        (results ())
        (easterday (tagnummer-ostertag year))
        (3lSoKj (3lSoKj year)))
    (while (<= i 24)
      (let* ((day (+ easterday 56 (* 7 i))))
        (when (< day 3lSoKj)
          (push (list (calendar-gregorian-from-absolute
                       (+ (calendar-absolute-from-gregorian (list 1 1 year))
                          -1 day))
                      (format "%s. sunday after Trinitatis" i))
                results)))
      (setq i (+ i 1)))
    results))

For any year, according to certain rules, certain sundays are named "nth
sunday after Trinitatis", depending on `year'.  The above function
returns the list of them for any given year.  But I can't use it
directly with `holiday-sexp' - I have to write my own interface function
for the calendar:

(defun holiday-sundays-after-trinitatis ()
  "List of visible sundays after Trinitatis in `calendar'."
  (let ((year displayed-year))
    (holiday-filter-visible-calendar
     (append (sonntage-nach-trinitatis year)
             (sonntage-nach-trinitatis (+ 1 year))))))

(eval-after-load "holidays"
  '(add-to-list 'calendar-holidays '(holiday-sundays-after-trinitatis)))

I wonder if we could provide a function `holiday-list', so that it
would be possible to do this:

(add-to-list 'calendar-holidays '(holidays-list '(holiday-sundays-after-trinitatis)))

It would no doubt be useful for other cases as well.  It could look
similar to this:

(defun holiday-list (sexp)
  (let ((y displayed-year)
        year dates)
    (holiday-filter-visible-calendar
     (append
      (progn
        (setq year y)
        (eval sexp))
      (progn
        (setq year (1+ y))
        (eval sexp))))))

Please tell me what you think.

If you don't want to add something like that, maybe we could at least
improve the manual a bit.  Under "Holiday Customization", there is this
paragraph:

|    Some holidays just don't fit into any of these forms because special
| calculations are involved in their determination.  In such cases you
| must write a Lisp function to do the calculation.  To include eclipses,
| for example, add `(eclipses)' to `holiday-other-holidays' and write an
| Emacs Lisp function `eclipses' that returns a (possibly empty) list of
| the relevant Gregorian dates among the range visible in the calendar
| window, with descriptive strings, like this:
| 
|      (((6 4 2012) "Lunar Eclipse") ((11 13 2012) "Solar Eclipse") ... )

I think it would be good to add a simple example for how such a
function could look like.  No user not browsing the sources will know
about `holiday-filter-visible-calendar'.  At least that function
should be mentioned somewhere.

Thanks,

Michael.

In GNU Emacs 24.1.50.1 (i486-pc-linux-gnu, GTK+ Version 3.2.3)
 of 2012-04-10 on zelenka, modified by Debian
 (emacs-snapshot package, version 2:20120410-1)
Windowing system distributor `The X.Org Foundation', version 11.0.11104000
Configured using:
 `configure '--build' 'i486-linux-gnu' '--host' 'i486-linux-gnu'
 '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib'
 '--localstatedir=/var' '--infodir=/usr/share/info'
 '--mandir=/usr/share/man' '--with-pop=yes'
 '--enable-locallisppath=/etc/emacs-snapshot:/etc/emacs:/usr/local/share/emacs/24.1.50/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.1.50/site-lisp:/usr/share/emacs/site-lisp'
 '--without-compress-info' '--with-crt-dir=/usr/lib/i386-linux-gnu/'
 '--with-x=yes' '--with-x-toolkit=gtk3' '--with-imagemagick=yes'
 'build_alias=i486-linux-gnu' 'host_alias=i486-linux-gnu'
 'CFLAGS=-DDEBIAN -DSITELOAD_PURESIZE_EXTRA=5000 -g -O2''