• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リストを逆順にする関数(LISP))

リストを逆順にする関数(LISP)の仕組みとは?

このQ&Aのポイント
  • 「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順にする関数について詳しく説明します。
  • 関数の仕組みは再帰を使い、リストの要素を逆順につなげていく方法です。
  • rplacd関数を使ってリストのポインタを逆転させ、最終的にリストを逆順にします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.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 の意味でも同じであることが (プログラムの作り方から) 保証される.

puntero
質問者

お礼

なんとなくわかりました。 ありがとうございます。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

質問文にある関数はB子さんが解答したもので、正しく動かないとK先生に指摘されたものではないですか? それをおいてもこの関数は一つのリストを共有して直接書きかえているので、質問文の後半にあるめも書きのように 考えてしまうと混乱してしまうと思います。 #2の方の回答で示されているリンク先にある図をよく見て追いかけてみてください。 つか前の質問どうしたの?

puntero
質問者

補足

正しく動かないけどリストの逆順は行われている という説明だったので本質的には変わらないと思います

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2
puntero
質問者

補足

おお!まさに聞きたい説明です! ありがとうございます。 このページの 3.返り値 で (rplacd '(c) '(b c)) のところで carがcのセルのcdrからcarがbのセルに繋がり、そのセルのcdrはまた同じcarがcのセルに繋がっていますよね。これってつまり '(c)と'(b c)のcdrのcは実体は同じということでしょうか?

noname#217196
noname#217196
回答No.1

rplacdの第二引数からcarで取り出す処理を忘れてる(誤植?)のではないでしょうか。 rplacd(x car(r)) ならうまく動きそう。

関連するQ&A