; 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)