; greek time
(define (range . args)
(case (length args)
((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
((3) (let ((le? (if (negative? (caddr args)) >= <=)))
(let loop ((x(car args)) (xs '()))
(if (le? (cadr args) x)
(reverse xs)
(loop (+ x (caddr args)) (cons x xs))))))
(else (error 'range "unrecognized arguments"))))
(define (duration start end)
(when (< (cdr end) (cdr start))
(set! end (cons (- (car end) 1) (+ (cdr end) 60))))
(+ (* (- (car end) (car start)) 60)
(- (cdr end) (cdr start))))
(define (add-duration start duration)
(let ((end (cons (+ (car start) (quotient duration 60))
(+ (cdr start) (modulo duration 60)))))
(if (< (cdr end) 60) end
(cons (+ (car end) 1) (- (cdr end) 60)))))
(define (greek-time sunrise sunset)
(let ((hour-length (/ (duration sunrise sunset) 12)))
(map (lambda (dur) (add-duration sunrise dur))
(map (lambda (hour) (round (* hour hour-length)))
(range 13)))))
(display (greek-time '(5 . 45) '(20 . 29))) (newline)