; binary gap

(define-syntax while
  (syntax-rules ()
    ((while pred? body ...)
      (do () ((not pred?)) body ...))))

(define (gap n)
  (while (even? n) (set! n (/ n 2)))
  (let loop ((n n) (curr 0) (maxi 0))
    (cond ((zero? n) maxi)
          ((even? n) (loop (/ n 2) (+ curr 1) maxi))
          (else (loop (quotient n 2) 0 (max curr maxi))))))

(display (map gap '(9 15 20 529))) (newline)