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) "]")))))