問題3.18

(define (include-loop? x)
  (define first-point x)
  (define (iter x)
    (if (null? x)
        #f
        (or (eq? first-point x) (iter (cdr x)))))
  (iter (cdr x)))

;;出来たと思ったが、これだと途中から途中へ循環している場合に対応できない。
(define a '(1 2 3))
(set-cdr! (cddr a) (cdr a))
(include-loop? a)
;-> 無限ループ

(define (include-loop? x)
  (define checked '())
  (define (add-checked! a)
    (set! checked (cons a checked)))
  (define (already-checked? a)
    (not (not (memq a checked))))
  (define (iter x)
    (if (null? x)
        #f
        (begin
          (add-checked! x)
          (or (already-checked? x) (iter (cdr x))))))
  (iter (cdr x)))

(include-loop? a)
;-> #t
; ok