アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

隙があればlispを詰め込んで行きたい (7)

こんにちは、chibaです!
隙があればlispを詰め込んで行く毎日ですが、今日の課題は、

  "8/24(火)、
8/25(水)、
8/26(木)、
8/27(金)
8/31(火)、
9/1(水) 、
9/2(木) 、
9/3(金)
9/7(火) 、
9/8(水) 、
9/9(木) 、
9/10(金)
9/14(火)、
9/15(水)、
9/16(木)、
9/17(日)"

のような、曜日付き日付の文字列が与えられた場合に、日付に対応している曜日が正しいかの判定です。
日付はそれほどでもないですが、曜日は結構間違ってたりすることも多いですよね。

(SET' FOO
  "8/24(火)、
8/25(水)、
8/26(木)、
8/27(金)
8/31(火)、
9/1(水) 、
9/2(木) 、
9/3(金)
9/7(火) 、
9/8(水) 、
9/9(木) 、
9/10(金)
9/14(火)、
9/15(水)、
9/16(木)、
9/17(日)")

(PPCRE:DO-REGISTER-GROUPS ((#'PARSE-INTEGER MON) (#'PARSE-INTEGER DATE) DOW)
    ("(\\d+)/(\\d+)\\((.+)\\).*" FOO)
  (LET* ((CDOW (NTH-VALUE 6 (DECODE-UNIVERSAL-TIME (ENCODE-UNIVERSAL-TIME 0 0 0 DATE MON 2010))))
         (X (FORMAT NIL "~D/~D (~A)" MON DATE (ELT "月火水木金土日" CDOW)))
         (Y (FORMAT NIL "~D/~D (~A)" MON DATE DOW)))
    (FORMAT T "~A => ~A~%" X Y)
    (UNLESS (STRING= X Y)
      (ERROR "曜日が間違っています! (正)~A => (誤)~A~%" X Y))))

動作:

8/24 (火) => 8/24 (火)
8/25 (水) => 8/25 (水)
8/26 (木) => 8/26 (木)
8/27 (金) => 8/27 (金)
8/31 (火) => 8/31 (火)
9/1 (水) => 9/1 (水)
9/2 (木) => 9/2 (木)
9/3 (金) => 9/3 (金)
9/7 (火) => 9/7 (火)
9/8 (水) => 9/8 (水)
9/9 (木) => 9/9 (木)
9/10 (金) => 9/10 (金)
9/14 (火) => 9/14 (火)
9/15 (水) => 9/15 (水)
9/16 (木) => 9/16 (木)
9/17 (金) => 9/17 (日)
;>>> 曜日が間違っています! (正)9/17 (金) => (誤)9/17 (日)

こんな感じのものを書いてしのいでみました。
大体の内容ですが、単純に正規表現で切り出してシステムから割り出したものと一致するかを見ているだけです。
Common Lispで適当に書き捨てましたが、どちらかというとelispで書いた方が役立つ機会は多いかもしれません。 ■