1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-05 08:53:45 +00:00

* lisp/calendar/cal-dst.el: Use lexical-binding

(calendar-time-zone-daylight-rules, calendar-dst-starts)
(calendar-dst-ends, dst-in-effect): Bind `year' explicitly around `eval'.
This commit is contained in:
Stefan Monnier 2017-12-04 15:50:14 -05:00
parent ad039f9bcc
commit 2dd14bf725

View File

@ -1,4 +1,4 @@
;;; cal-dst.el --- calendar functions for daylight saving rules
;;; cal-dst.el --- calendar functions for daylight saving rules -*- lexical-binding:t -*-
;; Copyright (C) 1993-1996, 2001-2017 Free Software Foundation, Inc.
@ -220,29 +220,30 @@ The result has the proper form for `calendar-daylight-savings-starts'."
'((calendar-gregorian-from-absolute
(calendar-persian-to-absolute `(7 1 ,(- year 621))))))))
(prevday-sec (- -1 utc-diff)) ; last sec of previous local day
(year (1+ y))
new-rules)
;; Scan through the next few years until only one rule remains.
(while (cdr candidate-rules)
(dolist (rule candidate-rules)
;; The rule we return should give a Gregorian date, but here
;; we require an absolute date. The following is for efficiency.
(setq date (cond ((eq (car rule) 'calendar-nth-named-day)
(eval (cons 'calendar-nth-named-absday (cdr rule))))
((eq (car rule) 'calendar-gregorian-from-absolute)
(eval (cadr rule)))
(t (calendar-absolute-from-gregorian (eval rule)))))
(or (equal (current-time-zone
(calendar-time-from-absolute date prevday-sec))
(current-time-zone
(calendar-time-from-absolute (1+ date) prevday-sec)))
(setq new-rules (cons rule new-rules))))
;; If no rules remain, just use the first candidate rule;
;; it's wrong in general, but it's right for at least one year.
(setq candidate-rules (if new-rules (nreverse new-rules)
(list (car candidate-rules)))
new-rules nil
year (1+ year)))
(calendar-dlet* ((year (1+ y)))
;; Scan through the next few years until only one rule remains.
(while (cdr candidate-rules)
(dolist (rule candidate-rules)
;; The rule we return should give a Gregorian date, but here
;; we require an absolute date. The following is for efficiency.
(setq date (cond ((eq (car rule) #'calendar-nth-named-day)
(eval (cons #'calendar-nth-named-absday
(cdr rule))))
((eq (car rule) #'calendar-gregorian-from-absolute)
(eval (cadr rule)))
(t (calendar-absolute-from-gregorian (eval rule)))))
(or (equal (current-time-zone
(calendar-time-from-absolute date prevday-sec))
(current-time-zone
(calendar-time-from-absolute (1+ date) prevday-sec)))
(setq new-rules (cons rule new-rules))))
;; If no rules remain, just use the first candidate rule;
;; it's wrong in general, but it's right for at least one year.
(setq candidate-rules (if new-rules (nreverse new-rules)
(list (car candidate-rules)))
new-rules nil
year (1+ year))))
(car candidate-rules)))
;; TODO it might be better to extract this information directly from
@ -405,7 +406,8 @@ This function respects the value of `calendar-dst-check-each-year-flag'."
(or (let ((expr (if calendar-dst-check-each-year-flag
(cadr (calendar-dst-find-startend year))
(nth 4 calendar-current-time-zone-cache))))
(if expr (eval expr)))
(calendar-dlet* ((year year))
(if expr (eval expr))))
;; New US rules commencing 2007. https://www.iana.org/time-zones
(and (not (zerop calendar-daylight-time-offset))
(calendar-nth-named-day 2 0 3 year))))
@ -416,7 +418,8 @@ This function respects the value of `calendar-dst-check-each-year-flag'."
(or (let ((expr (if calendar-dst-check-each-year-flag
(nth 2 (calendar-dst-find-startend year))
(nth 5 calendar-current-time-zone-cache))))
(if expr (eval expr)))
(calendar-dlet* ((year year))
(if expr (eval expr))))
;; New US rules commencing 2007. https://www.iana.org/time-zones
(and (not (zerop calendar-daylight-time-offset))
(calendar-nth-named-day 1 0 11 year))))
@ -425,25 +428,25 @@ This function respects the value of `calendar-dst-check-each-year-flag'."
(defun dst-in-effect (date)
"True if on absolute DATE daylight saving time is in effect.
Fractional part of DATE is local standard time of day."
(let* ((year (calendar-extract-year
(calendar-gregorian-from-absolute (floor date))))
(dst-starts-gregorian (eval calendar-daylight-savings-starts))
(dst-ends-gregorian (eval calendar-daylight-savings-ends))
(dst-starts (and dst-starts-gregorian
(calendar-dlet* ((year (calendar-extract-year
(calendar-gregorian-from-absolute (floor date)))))
(let* ((dst-starts-gregorian (eval calendar-daylight-savings-starts))
(dst-ends-gregorian (eval calendar-daylight-savings-ends))
(dst-starts (and dst-starts-gregorian
(+ (calendar-absolute-from-gregorian
dst-starts-gregorian)
(/ calendar-daylight-savings-starts-time
60.0 24.0))))
(dst-ends (and dst-ends-gregorian
(+ (calendar-absolute-from-gregorian
dst-starts-gregorian)
(/ calendar-daylight-savings-starts-time
60.0 24.0))))
(dst-ends (and dst-ends-gregorian
(+ (calendar-absolute-from-gregorian
dst-ends-gregorian)
(/ (- calendar-daylight-savings-ends-time
calendar-daylight-time-offset)
60.0 24.0)))))
(and dst-starts dst-ends
(if (< dst-starts dst-ends)
(and (<= dst-starts date) (< date dst-ends))
(or (<= dst-starts date) (< date dst-ends))))))
dst-ends-gregorian)
(/ (- calendar-daylight-savings-ends-time
calendar-daylight-time-offset)
60.0 24.0)))))
(and dst-starts dst-ends
(if (< dst-starts dst-ends)
(and (<= dst-starts date) (< date dst-ends))
(or (<= dst-starts date) (< date dst-ends)))))))
;; used by calc, lunar, solar.
(defun dst-adjust-time (date time)