local-timeを使ったブログラム例

(簡単に、ですが)local-timeのマニュアルに目を通したので簡単なプログラムを書いてみました。

;aniversary
;命日から年忌・中陰法要の年月日を返す。

;「使い方」
;(aniversary)で年忌・中陰両方表示。
;(aniversary nil以外の任意の引数)で年忌のみ表示

;使用ライブラリ
;local-time


;パッケージの読み込み
(ql:quickload "local-time")

;関数のインポート
(import '(local-time:timestamp+ local-time:parse-timestring local-time:timestamp-day local-time:timestamp-month local-time:timestamp-year))


;命日を保持する変数を初期化
(defparameter *aniversary* nil)
;中陰日の経過日数のリスト
(defparameter *day-list* '(6 13 20 27 34 41 48 99))
;年忌法要の経過年数リスト
(defparameter *year-list* '(1 2 6 12 16 22 26 32 36 42 46 49))
;中陰法要名リスト
(defparameter *day-name* '(初七日 二七日 三七日 四七日 五七日 六七日 四十九日 百箇日))
;年忌法要名リスト
(defparameter *year-name* '(一周忌 三回忌 七回忌 十三回忌 十七回忌 二十三回忌 二十七回忌 三十三回忌 三十七回忌 四十三回忌 四十七回忌 五十回忌))
;中陰法要日を保持するリストを初期化
(defparameter *tyuuinn-houyou-bi* nil)
;年忌法要日を保持するリストを初期化
(defparameter *nennki-houyou-bi* nil)

;命日から中陰法要日を計算して*tyuuinn-houyou-bi*に代入
(defun day-cal ()
  (setq *tyuuinn-houyou-bi* 
        (mapcar #'(lambda (x) (timestamp+ *aniversary* x :day)) ;中陰法要日を計算
                *day-list*))) ;命日から中陰法要日までの日数が格納されている 

;命日から年忌法要日を計算して*nennki-houyou-bi*に代入
(defun year-cal ()
  (setq *nennki-houyou-bi* 
        (mapcar #'(lambda (x) (timestamp+ *aniversary* x :year)) ;年忌法要日を計算
                *year-list*))) ;命日から年忌法要までの年数が格納されている 
  

; 法要名のリストと法要日のリストを引数に取り、法要日を表示 
(defun print-aniversary (aniversary-name-list aniversary-day-list)
  (mapcar #'(lambda (x y) (format t "~&~aは~a年~a月~a日です。"
                                    x
                                    (timestamp-year y)
                                    (timestamp-month y) 
                                    (timestamp-day y)))
            aniversary-name-list ;法要名のリスト
            aniversary-day-list)) ;法要日のリスト 

;これが本体です。
;引数無で呼び出した場合は年忌、中陰ともに表示。
;引数有で呼び出した場合は年忌のみ表示(引数は何でも可)
(defun aniversary (&optional(flag nil)) ;引数指定がなければflagをnilにする
  (format t "命日を入力して下さい。~%(ex:1999-10-18)~%")
  ;キーボードからの入力をtimestampオブジェクトに変換して*aniversary*に代入
  (setf *aniversary* (parse-timestring (read-line))) 

  (if flag 
    (progn ;引数があれば年忌法要のみ
      (year-cal)
      (print-aniversary *year-name* *nennki-houyou-bi*))
    (progn ;引数が無ければ年忌・中陰を表示
      (year-cal)
      (day-cal)
      (print-aniversary *day-name* *tyuuinn-houyou-bi*)
      (print-aniversary *year-name* *nennki-houyou-bi*))))