SICP 読み (103) 3.3.1 可変リスト構造

微妙。

 (define (count-pairs-iter x l)
   (if (pair? x)
       (begin (set-list! l x)
              (count-pairs-iter (car x) l)
              (count-pairs-iter (cdr x) l))
       (if (null? x)
           l)))

count-pairs-iter なんですが、たまたま動いてる感満点です。でもリストの終端は cdr 部分が '() なソレ、というのが前提であるとするなら、上記でも良いっちゃ良いようにも思えるなぁ。cdr 側で二回も '() を検出する事はあり得ないだろうし。
あるいは、(pair? x) が #f で (null? x) も #f だった場合は # が戻るんだと思うのですが、最終的に # が戻るパターンって (上で書いてるコトと矛盾してますが)、あるのかなぁ、と。

ってか、この手法を使えば次の問題のループ検出ができるな。cdr が指してるソレを保存しておきつつ、eq? なソレがあったらダウト、みたいな感じですか。(逆