car と cdr の複数の呼び出しがどのように連携するかを理解しようとしています。たとえば、次の例は十分に単純に見えます。
(car (cdr '(car (cdr (1 2 3))))
私の DrRacket コンパイラ'(cdr (1 2 3))
は実行時に出力しますが、その方法がわかりません。(1 2 3) の cdr を最初に取るべきではありませんか? 最初の 2 台の車と cdr はどうですか?
いいえ、引用演算子はそれに続くすべてのフォームとサブフォームを引用します。リストの最初の car と cdr だけが実行されます。最初に(cdr '(car (cdr (1 2 3)))
-> '((cdr (1 2 3))
、次に(car '((cdr (1 2 3)))
-> '(cdr (1 2 3))
。
ここでの問題は、「引用」があなたが思っているよりもはるかに強力だということです。特に、引用符は「読者」 (プログラムを調べる最初のコード片) への指示であり、プログラムを次のように書き直します。
(car (cdr '(car (cdr (1 2 3))))
...の中へ
(car (cdr (list (quote car) (list (quote cdr) (list 1 2 3))))
つまり、quote は細流化して、すべての左括弧を新しいリストの作成に変更し、すべての識別子を引用記号に変更します。
識別子以外のもの (例: 'abc
) に引用符を適用することは、かなりわかりにくい概念であり、通常、リストの経験が豊富で、リストを短縮するための優れた方法を探していると、より理にかなっています。