Shammer's Philosophy

My private adversaria

multiple-value-bindを使用せずに複数の返り値を処理する

multiple-value-bindで取得した変数を無視する - Shammerismの別バージョン。declareで無視させるのではなく、そもそも受け取る値を選択するバージョン。何度もdecode-universal-timeを呼出すので効率はよくなさそうだ。かと言って、これを一度実行して let か何かで戻り値を受け取っても一つの値になってしまった。どういうことかと言うと、以下のようにしてみても x に decode-universal-time の結果全てが格納されず、実際は一つの値のみが格納されたということだ。

? (defparameter x (decode-universal-time 824523425))
X
? x
5
? (type-of x)
(INTEGER 0 1152921504606846975)
? (nth-value 1 x)
NIL
? 

decode-universal-timeの戻り値を使い回すような書き方はできないことがわかったので、以下のようにするしかない。

(defun get-timestamp-as-string (time)
  (let ((day-names '("Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"))
        (mon-names '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")))
    (labels
        ((pad (n)
              (if (< (length (write-to-string n)) 2)
                  (concat "0" (write-to-string n))
                (write-to-string n))))
      (let ((second (nth-value 0 (decode-universal-time time)))
	    (minute (nth-value 1 (decode-universal-time time)))
	    (hour (nth-value 2 (decode-universal-time time)))
	    (date (nth-value 3 (decode-universal-time time)))
	    (month (nth-value 4 (decode-universal-time time)))
	    (year (nth-value 5 (decode-universal-time time)))
	    (day-of-week (nth-value 6 (decode-universal-time time))))
	(concat "[" (nth day-of-week day-names) " " (nth (- month 1) mon-names) " " (pad date) " "
		(pad hour) ":" (pad minute) ":" (pad second) " " (write-to-string year) "]")))))