「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順に関数がよくわかりません。
以下がその関数です。
(defun nreverse (x) (nrev2 x nil))
(defun nrev2 (x r)
(cond ((null x) r)
(t (nrev2 (cdr x) x)
(rplacd x r) )))
xがnilになるまで再帰を繰り返し、((null x) r) で再帰を戻りますがなぜs (rplacd x r)でリストが逆順になるんでしょうか。例えばxを(a b c)とすると
x:(a b c) r:nil
↓
x:(b c) r:(a b c)
↓
x:(c) r:(b c)
↓
x:nil r:(c)
↓
rplacd (c) (b c)
↓
rplacd (b c) (a b c)
↓
rplacd (a b c) nil
となるのですが、これじゃあ全然リストは逆順になりませんよね。
誰が教えてください、お願いします。
ちなみにrplacd は第一引数のcdrを第二引数に変換する関数です。
お礼
なんとなくわかりました。 ありがとうございます。