Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-01-26

KMRCLを眺める (73) WITH-UTIME-DECODING

| 23:27 | KMRCLを眺める (73) WITH-UTIME-DECODING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (73) WITH-UTIME-DECODING - わだばLisperになる

今回はKMRCLのio.lisp中からWITH-UTIME-DECODINGです。

定義を眺めてみると

(defmacro with-utime-decoding ((utime &optional zone) &body body)
  "UTIME is a universal-time, ZONE is a number of hours offset from UTC, or NIL to use local time.  Execute BODY in an environment where SECOND MINUTE HOUR DAY-OF-MONTH MONTH YEAR DAY-OF-WEEK DAYLIGHT-P ZONE are bound to the decoded components of the universal time"
  `(multiple-value-bind
       (second minute hour day-of-month month year day-of-week daylight-p zone)
       (decode-universal-time ,utime ,@(if zone (list zone)))
     (declare (ignorable second minute hour day-of-month month year day-of-week daylight-p zone))
     ,@body))

となっていますが、アナフォリックマクロの一種みたいですね。

動作は、

(WITH-UTIME-DECODING ((GET-UNIVERSAL-TIME))
  (LIST YEAR MONTH DAY-OF-MONTH))
;⇒ (2010 1 26)

という風になっています。

YEARや、MONTHの変数に暗黙の変数束縛があるわけですね。

UTIME系の構文は毎度のようにSECONDや、HOUR等をずらっと並べて書くのが面倒なことがあるので、これは結構便利かもしれなと思いました。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100126