bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#15149: 24.3; [PATCH] compute calendar-chinese-year-cache lazily


From: Leo Liu
Subject: bug#15149: 24.3; [PATCH] compute calendar-chinese-year-cache lazily
Date: Wed, 21 Aug 2013 13:23:08 +0800

Seems a lot of hassle to manually maintain a cache and the computation
is reasonable fast (it takes 0.5 seconds on my Core 2 Duo 2G laptop). So
I propose this patch.

=== modified file 'lisp/calendar/cal-china.el'
--- lisp/calendar/cal-china.el  2013-01-01 09:11:05 +0000
+++ lisp/calendar/cal-china.el  2013-08-21 05:18:14 +0000
@@ -39,10 +39,6 @@
 ;; not accepted by all authorities.  The date of Chinese New Year is
 ;; correct from 1644-2051.
 
-;; Note to maintainers:
-;; Use `chinese-year-cache-init' every few years to recenter the default
-;; value of `chinese-year-cache'.
-
 ;;; Code:
 
 (require 'calendar)
@@ -324,61 +320,9 @@
                   ;; Second month on list is not a leap month.
                   (calendar-chinese-number-months (cdr list) 1)))))))
 
-(defvar calendar-chinese-year-cache
-  ;; Maintainers: delete existing value, position point at start of
-  ;; empty line, then call  M-: (calendar-chinese-year-cache-init N)
-  '((2000 (12 730126) (1 730155) (2 730185) (3 730215) (4 730244) (5 730273)
-          (6 730303) (7 730332) (8 730361) (9 730391) (10 730420) (11 730450))
-    (2001 (12 730480) (1 730509) (2 730539) (3 730569) (4 730598) (4.5 730628)
-          (5 730657) (6 730687) (7 730716) (8 730745) (9 730775) (10 730804)
-          (11 730834))
-    (2002 (12 730863) (1 730893) (2 730923) (3 730953) (4 730982) (5 731012)
-          (6 731041) (7 731071) (8 731100) (9 731129) (10 731159) (11 731188))
-    (2003 (12 731218) (1 731247) (2 731277) (3 731307) (4 731336) (5 731366)
-          (6 731396) (7 731425) (8 731455) (9 731484) (10 731513) (11 731543))
-    (2004 (12 731572) (1 731602) (2 731631) (2.5 731661) (3 731690) (4 731720)
-          (5 731750) (6 731779) (7 731809) (8 731838) (9 731868) (10 731897)
-          (11 731927))
-    (2005 (12 731956) (1 731986) (2 732015) (3 732045) (4 732074) (5 732104)
-          (6 732133) (7 732163) (8 732193) (9 732222) (10 732252) (11 732281))
-    (2006 (12 732311) (1 732340) (2 732370) (3 732399) (4 732429) (5 732458)
-          (6 732488) (7 732517) (7.5 732547) (8 732576) (9 732606) (10 732636)
-          (11 732665))
-    (2007 (12 732695) (1 732725) (2 732754) (3 732783) (4 732813) (5 732842)
-          (6 732871) (7 732901) (8 732930) (9 732960) (10 732990) (11 733020))
-    (2008 (12 733049) (1 733079) (2 733109) (3 733138) (4 733167) (5 733197)
-          (6 733226) (7 733255) (8 733285) (9 733314) (10 733344) (11 733374))
-    (2009 (12 733403) (1 733433) (2 733463) (3 733493) (4 733522) (5 733551)
-          (5.5 733581) (6 733610) (7 733639) (8 733669) (9 733698) (10 733728)
-          (11 733757))
-    (2010 (12 733787) (1 733817) (2 733847) (3 733876) (4 733906) (5 733935)
-          (6 733965) (7 733994) (8 734023) (9 734053) (10 734082) (11 734112))
-    (2011 (12 734141) (1 734171) (2 734201) (3 734230) (4 734260) (5 734290)
-          (6 734319) (7 734349) (8 734378) (9 734407) (10 734437) (11 734466))
-    (2012 (12 734496) (1 734525) (2 734555) (3 734584) (4 734614) (4.5 734644)
-          (5 734673) (6 734703) (7 734732) (8 734762) (9 734791) (10 734821)
-          (11 734850))
-    (2013 (12 734880) (1 734909) (2 734939) (3 734968) (4 734998) (5 735027)
-          (6 735057) (7 735087) (8 735116) (9 735146) (10 735175) (11 735205))
-    (2014 (12 735234) (1 735264) (2 735293) (3 735323) (4 735352) (5 735382)
-          (6 735411) (7 735441) (8 735470) (9 735500) (9.5 735530) (10 735559)
-          (11 735589))
-    (2015 (12 735618) (1 735648) (2 735677) (3 735707) (4 735736) (5 735765)
-          (6 735795) (7 735824) (8 735854) (9 735884) (10 735914) (11 735943))
-    (2016 (12 735973) (1 736002) (2 736032) (3 736061) (4 736091) (5 736120)
-          (6 736149) (7 736179) (8 736208) (9 736238) (10 736268) (11 736297))
-    (2017 (12 736327) (1 736357) (2 736386) (3 736416) (4 736445) (5 736475)
-          (6 736504) (6.5 736533) (7 736563) (8 736592) (9 736622) (10 736651)
-          (11 736681))
-    (2018 (12 736711) (1 736741) (2 736770) (3 736800) (4 736829) (5 736859)
-          (6 736888) (7 736917) (8 736947) (9 736976) (10 737006) (11 737035))
-    (2019 (12 737065) (1 737095) (2 737125) (3 737154) (4 737184) (5 737213)
-          (6 737243) (7 737272) (8 737301) (9 737331) (10 737360) (11 737389))
-    (2020 (12 737419) (1 737449) (2 737478) (3 737508) (4 737538) (4.5 737568)
-          (5 737597) (6 737627) (7 737656) (8 737685) (9 737715) (10 737744)
-          (11 737774)))
+(defvar calendar-chinese-year-cache nil
   "Alist of Chinese year structures as determined by `chinese-year'.
-The default can be nil, but some values are precomputed for efficiency.")
+The default is nil but some values are lazily computed for efficiency.")
 
 (defun calendar-chinese-year (y)
   "The structure of the Chinese year for Gregorian year Y.
@@ -386,6 +330,12 @@
 of the Chinese months from the Chinese month following the solstice in
 Gregorian year Y-1 to the Chinese month of the solstice of Gregorian year Y.
 The list is cached in `calendar-chinese-year-cache' for further use."
+  (or calendar-chinese-year-cache
+      (setq calendar-chinese-year-cache
+            (mapcar (lambda (y)
+                      (cons y (calendar-chinese-compute-year y)))
+                    (let ((year (nth 5 (decode-time))))
+                      (number-sequence (- year 10) (+ year 10))))))
   (let ((list (cdr (assoc y calendar-chinese-year-cache))))
     (or list
         (setq list (calendar-chinese-compute-year y)
@@ -393,28 +343,6 @@
                                          (list (cons y list)))))
     list))
 
-;; Maintainer use.
-(defun calendar-chinese-year-cache-init (year)
-  "Insert an initialization value for `calendar-chinese-year-cache' after 
point.
-Computes values for 10 years either side of YEAR."
-  (setq year (- year 10))
-  (let (calendar-chinese-year-cache end)
-    (save-excursion
-      (insert "'(")
-      (dotimes (n 21)
-        (princ (cons year (calendar-chinese-compute-year year))
-               (current-buffer))
-        (insert (if (= n 20) ")" "\n"))
-        (setq year (1+ year)))
-      (setq end (point)))
-    (save-excursion
-      ;; fill-column -/+ 5.
-      (while (and (< (point) end)
-                  (re-search-forward "^.\\{65,75\\})" end t))
-        (delete-char 1)
-        (insert "\n")))
-    (indent-region (point) end)))
-
 (defun calendar-chinese-to-absolute (date)
   "The number of days elapsed between the Gregorian date 12/31/1 BC and DATE.
 DATE is a Chinese date (cycle year month day).  The Gregorian date


reply via email to

[Prev in Thread] Current Thread [Next in Thread]