今日は第何火曜日?

30分プログラム、その596。今日が第何火曜日かを調べるプログラム。
ウチのCATVターミナルは頭があまり良ろしくなくて、録画予約をするときは「第3火曜日の9:00〜」という指定しかできない。
というわけで、今日が第何火曜日かを調べる関数を書いてみる。あ、もちろん火曜日以外でも大丈夫で、指定した日が第n{日,月,火,水,木,金,土}曜日かを調べる関数ですよ。

使い方

6月のカレンダーはこうなっている。

      6月 2009
日 月 火 水 木 金 土
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
;; 2009/6/2は0番目の火曜日
gosh> (date-week-day-number-of-month (make-day 2009 6 2))
0

;; 6月全部を調べてみる
gosh> (check-june)
2009/06/1 ... 1 th
2009/06/2 ... 1 th
2009/06/3 ... 1 th
2009/06/4 ... 1 th
2009/06/5 ... 1 th
2009/06/6 ... 1 th
2009/06/7 ... 1 th
2009/06/8 ... 2 th
2009/06/9 ... 2 th
2009/06/10 ... 2 th
2009/06/11 ... 2 th
2009/06/12 ... 2 th
2009/06/13 ... 2 th
2009/06/14 ... 2 th
2009/06/15 ... 3 th
2009/06/16 ... 3 th
2009/06/17 ... 3 th
2009/06/18 ... 3 th
2009/06/19 ... 3 th
2009/06/20 ... 3 th
2009/06/21 ... 3 th
2009/06/22 ... 4 th
2009/06/23 ... 4 th
2009/06/24 ... 4 th
2009/06/25 ... 4 th
2009/06/26 ... 4 th
2009/06/27 ... 4 th
2009/06/28 ... 4 th
2009/06/29 ... 5 th
2009/06/30 ... 5 th

ソースコード

結構悩んだけど、実はすごく簡単。テストコードのほうが長い。

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; wofm.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/06/02 21:24:26
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(use srfi-19)

(define (date-week-day-number-of-month date)
  (quotient (- (date-day date) 1) 7))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use srfi-1)
(define (today)
  (time-utc->date (current-time time-utc)))

(define (make-day year month day)
  (make-date 0 ;; nano second
	     0 ;; second
	     0 ;; min
	     0 ;; hour
	     day ;; day
	     month
	     year
	     (date-zone-offset (today))))

(define (check-june)
  (for-each
   (lambda (day n) (print #`"2009/06/,day ... ,(+ 1 n) th"))
   (iota 30 1)
   (map date-week-day-number-of-month
	(map (cut make-day 2009 6 <>) (iota 30 1)))))