- ベストアンサー
リストを逆順にする関数(LISP)の仕組みとは?
- 「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順にする関数について詳しく説明します。
- 関数の仕組みは再帰を使い、リストの要素を逆順につなげていく方法です。
- rplacd関数を使ってリストのポインタを逆転させ、最終的にリストを逆順にします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「'(c)と'(b c)のcdrのcは実体は同じということでしょうか?」 という聞き方だと (eq (car '(c)) (cadr '(b c))) は常に t を返すか? と解釈したくなる (これは正しい) んだけど, それはおそらく「本来聞きたいこと」じゃないよね? 「'(c) で表される consセルと '(b c) の cdr である consセルの実体が同じかどうか」ということであればは一般には不定 (等しいこともあれば等しくないこともある). つまり (equal '(c) (cdr '(b c))) => t (eql '(c) (cdr '(b c))) => t または nil (eq '(c) (cdr '(b c))) => t または nil ということになる. もっとも, 今の場合には eq の意味でも同じであることが (プログラムの作り方から) 保証される.
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
質問文にある関数はB子さんが解答したもので、正しく動かないとK先生に指摘されたものではないですか? それをおいてもこの関数は一つのリストを共有して直接書きかえているので、質問文の後半にあるめも書きのように 考えてしまうと混乱してしまうと思います。 #2の方の回答で示されているリンク先にある図をよく見て追いかけてみてください。 つか前の質問どうしたの?
補足
正しく動かないけどリストの逆順は行われている という説明だったので本質的には変わらないと思います
- osamuy
- ベストアンサー率42% (1231/2878)
この人のとか。 http://webcache.googleusercontent.com/search?q=cache:L_omEJJSe1gJ:d.hatena.ne.jp/Rion778/20100918/1284796410+%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AELISP+nrev2&cd=5&hl=ja&ct=clnk&gl=jp&lr=lang_ja 質問文のコードと違っているのは、増補改訂版だから?
補足
おお!まさに聞きたい説明です! ありがとうございます。 このページの 3.返り値 で (rplacd '(c) '(b c)) のところで carがcのセルのcdrからcarがbのセルに繋がり、そのセルのcdrはまた同じcarがcのセルに繋がっていますよね。これってつまり '(c)と'(b c)のcdrのcは実体は同じということでしょうか?
rplacdの第二引数からcarで取り出す処理を忘れてる(誤植?)のではないでしょうか。 rplacd(x car(r)) ならうまく動きそう。
お礼
なんとなくわかりました。 ありがとうございます。