; weekdays between two dates
(define (julian year month day)
(let* ((a (quotient (- 14 month) 12))
(y (+ year 4800 (- a)))
(m (+ month (* 12 a) -3)))
(+ day
(quotient (+ (* 153 m) 2) 5)
(* 365 y)
(quotient y 4)
(- (quotient y 100))
(quotient y 400)
(- 32045))))
(define (weekdays y-from m-from d-from y-to m-to d-to)
(let* ((from (julian y-from m-from d-from))
(to (julian y-to m-to d-to))
(diff (- to from)))
(+ (* 5 (quotient diff 7))
(let loop ((k (modulo diff 7)) (w 0))
(if (zero? k) w
(loop (- k 1)
(+ w (if (< (modulo (- to k) 7) 5) 1 0))))))))
(display (weekdays 2013 7 5 2013 7 6)) (newline)
(display (weekdays 2013 7 5 2013 7 7)) (newline)
(display (weekdays 2013 7 5 2013 7 8)) (newline)
(display (weekdays 2013 7 5 2013 7 9)) (newline)
(display (weekdays 2013 7 5 2013 7 10)) (newline)
(display (weekdays 2013 7 5 2013 7 11)) (newline)
(display (weekdays 2013 7 5 2013 7 18)) (newline)
(display (weekdays 2013 7 5 2013 7 25)) (newline)