; binary reflected gray code
(define (ash int cnt)
(if (negative? cnt)
(let ((n (expt 2 (- cnt))))
(if (negative? int)
(+ -1 (quotient (+ 1 int) n))
(quotient int n)))
(* (expt 2 cnt) int)))
(define (gray n)
(define (add x) (lambda (y) (+ x y)))
(let loop ((n n) (g 1) (gs (list 0)))
(if (zero? n) gs
(loop (- n 1) (+ g g)
(append gs (map (add g) (reverse gs)))))))
(display (gray 0)) (newline)
(display (gray 1)) (newline)
(display (gray 2)) (newline)
(display (gray 3)) (newline)
(display (gray 4)) (newline)
(display (gray 5)) (newline)
(define (nth-gray n) (bitwise-xor n (ash n -1)))
(display (nth-gray 0)) (newline)
(display (nth-gray 1)) (newline)
(display (nth-gray 2)) (newline)
(display (nth-gray 3)) (newline)
(display (nth-gray 4)) (newline)
(display (nth-gray 5)) (newline)
(display (nth-gray 6)) (newline)
(display (nth-gray 7)) (newline)
(display (nth-gray 8)) (newline)
(display (nth-gray 9)) (newline)