Shammer's Philosophy

My private adversaria

get-decoded-time

これを使うと、日付情報を取得できる。ただ、多値関数なので、受け取りにmultiple-value-bindを使用する必要がある。簡単なサンプルは以下。

(defmacro get-base-time (&rest body)
    `(multiple-value-bind
	(second minute hour date month year day-of-week dst-p time-zone)
      (get-decoded-time)
      ,@body))

(defun get-time ()
  (get-base-time
   (format t "~2,'0d:~2,'0d:~2,'0d ~a ~2,' d/~2,'0d/~d ~a (GMT~@d)"
	   hour
	   minute
	   second
	   (nth day-of-week *day-names*)
	   month
	   date
	   year
	   dst-p
	   (- time-zone))))

いろいろな形で時刻を整形するシーンがありそうだから、multiple-value-bindの部分だけ分けてマクロにしてみた。ただ、これを呼び出す側がマクロで定義している変数を知らないとうまく使えないのが難点・・・やっぱり時間を表すクラスを作ってやるのがいいのだろうか。