2

私は.emacs私の「休日」が太陽経度が15度の各倍数を横切る時間を表示するように、太陽の用語を実装しようとしています。関連するスニペットは次のとおりです。

(defun next-solar-term-date (d)
  (solar-date-next-longitude d 15))

(defconst solar-term-names
  ["moderate cold" "severe cold" "spring commerces"
   "rain water" "insects awaken" "vernal equinox"
   "Ching Ming" "corn rain" "summer commerces"
   "corn forms" "corn on ear" "summer solstice"
   "minor heat" "great heat" "autumn commerces"
   "end of heat" "white dew" "autumnal equinox"
   "cold dew" "frost" "winter commerces"
   "light snow" "heavy snow" "winter solstice"])

(setq solar-terms-holidays
      (let* ((k 0) (mylist nil))
        (dotimes (k 4);k=season
          (let* ((j 0))
            (dotimes (j 5);no equinoxes/solstices --- use solar for them
              (let* ((i (+ j (* 6 k)))
                     (month (+ 1 (/ i 2)))
                     (astronextdate (next-solar-term-date
                                     (calendar-astro-from-absolute
                                      (+ (* 15 i)
                                         (calendar-absolute-from-gregorian
                                          (list 1 1 displayed-year))))))
                     (s (aref solar-term-names i))
                     (absnextdate (calendar-absolute-from-astro
                                   astronextdate))
                     (gregnextdate (calendar-gregorian-from-absolute
                                    (floor absnextdate)))
                     (compt (* 24 (- absnextdate (floor absnextdate))))
                     (str (concat s " "
                                  (solar-time-string
                                   compt (if (dst-in-effect absnextdate)
                                             calendar-daylight-time-zone-name
                                           calendar-standard-time-zone-name))))
                     (d (extract-calendar-day gregnextdate)))
                (setq mylist (append mylist
                                     (list
                                      (list 'holiday-fixed month d str))))))))
        mylist))

しかし、emacs (Gentoo のバージョン 23.2-r2) は、display-year が起動時に void 変数であることに文句を言い、カレンダーを生成しようとしてM-x calendar RETも役に立ちません。どうすればそれを修正できますか?.emacs(これは間違いなく他のすべてを台無しにするので、myで表示された年を定義することは確かにありません...)

4

2 に答える 2

3

displayed-yearシンボルを値にバインドしていないためです。let*のバインディングの最後の行を確認してくださいastronextdate

                                      (list 1 1 displayed-year))))))

そのシンボルはどの値にもバインドされていないため、void 変数エラーが発生します。変数はcalendar、ドキュメントのあるライブラリで定義されています。

;; A note on free variables:

;; The calendar passes around a few dynamically bound variables, which
;; unfortunately have rather common names.  They are meant to be
;; available for external functions, so the names can't be changed.

;; displayed-month, displayed-year: bound in calendar-generate, the
;;   central month of the 3 month calendar window

したがって、次を追加するだけでよいようです。

(require 'calendar)

事前に変数を定義するパッケージをEmacsに強制的にロードさせます。

つまり、定義されますが、まだバインドされていません。静的にバインドされた を想定しないようにコードを変更する必要がありますが、カレンダーが実際に実行されているときにのみバインドされるsolar-terms-holidaysため、必要に応じてそれらを計算する関数に変換する必要があります...displayed-year

したがって、考えられる解決策の 1 つは、次のようにラップしてsetq、変数が期待どおりにバインドされるようにすることです。

(save-window-excursion
  (calendar)
  (setq solar-terms-holidays
        ....)
  (calendar-exit))
于 2010-11-29T18:25:47.787 に答える
1

計算は、利用可能になるまで延期する必要displayed-yearがあります。これは、ペーストの最後の式を次の2つに置き換えることで実現できます。

(defun solar-term (i month)
  (let* ((astronextdate (next-solar-term-date
                         (calendar-astro-from-absolute
                          (+ (* 15 i)
                             (calendar-absolute-from-gregorian
                              (list 1 1 displayed-year))))))
         (s (aref solar-term-names i))
         (absnextdate (calendar-absolute-from-astro
                       astronextdate))
         (gregnextdate (calendar-gregorian-from-absolute
                        (floor absnextdate)))
         (compt (* 24 (- absnextdate (floor absnextdate))))
         (str (concat s " "
                      (solar-time-string
                       compt (if (dst-in-effect absnextdate)
                                 calendar-daylight-time-zone-name
                               calendar-standard-time-zone-name))))
         (d (extract-calendar-day gregnextdate)))
    (holiday-fixed month d str)))

(setq solar-terms-holidays
      (let* ((mylist nil))
        (dotimes (k 4)    ;k=season
          (dotimes (j 5)  ;no equinoxes/solstices --- use solar for them
            (let* ((i (+ j (* 6 k)))
                   (month (+ 1 (/ i 2))))
              (push `(solar-term ,i ,month) mylist))))
        mylist))
于 2010-11-30T12:46:21.003 に答える