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-08-29

KMRCLを眺める(195) MONTHNAME

| 23:48 | KMRCLを眺める(195) MONTHNAME - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(195) MONTHNAME - わだばLisperになる

今回は、KMRCLのdatetime.lispからMONTHNAMEです。

定義を読むと、どうも月の数字から西暦の月の名前を割り出す関数のようです。

;; Monthnames taken from net-telent-date to support lml2

(defvar *monthnames*
  '((1 . "January")
    (2 . "February")
    (3 . "March")
    (4 . "April")
    (5 . "May")
    (6 . "June")
    (7 . "July")
    (8 . "August")
    (9 . "September")
    (10 . "October")
    (11 . "November")
    (12 . "December")))

(defun monthname (stream arg colon-p at-p &optional width (mincol 0) (colinc 1) (minpad 0) (padchar #\Space))
  "Print the name of the month (1=January) corresponding to ARG on STREAM.  This is intended for embedding in a FORMAT directive: WIDTH governs the number of characters of text printed, MINCOL, COLINC, MINPAD, PADCHAR work as for ~A"
  (declare (ignore colon-p))
  (let ((monthstring (cdr (assoc arg *monthnames*))))
    (if (not monthstring) (return-from monthname nil))
    (let ((truncate (if width (min width (length monthstring)) nil)))
      (format stream
              (if at-p "~V,V,V,V@A" "~V,V,V,VA")
              mincol colinc minpad padchar
              (subseq monthstring 0 truncate)))))

引数の並びと定義の感じからして、FORMATTERのように使うような気がしましたが、KMRCLで実際に使われている箇所が探し出せませんでした。

(FORMAT NIL #'KL::MONTHNAME 9 NIL NIL)
;⇒ "September"

;; 切り詰めてみる
(FORMAT NIL #'KL::MONTHNAME 9 NIL NIL 3)
;⇒ "Sep"

Googleコード検索で探してみたところでは、

(format nil
        (formatter "~2,'0D-~3/kmrcl::monthname/-~4,'0D ~2,'0D:~2,'0D")
        3 3 2010 10 20)
;⇒ "03-Mar-2010 10:20"

のようなものがみつかりました。

なるほど、こういう風に~//で使ったりもできますね。