2012-05-08 5 views
2

私はcarとcdrの複数の呼び出しが一緒に機能する方法を理解しようとしています。この短い文字列のcdr/carコマンドの出力は何ですか?

(car (cdr '(car (cdr (1 2 3)))) 

マイDrRacketコンパイラの出力'(cdr (1 2 3))は、それが実行されたとき、私はどのように表示されていない。たとえば、次の例は、単純に十分なようです。最初に(1 2 3)のcdrを取るべきではありませんか?最初の2台の車とCDRはどうですか?

答えて

5

いいえ、引用符演算子は、それに続くすべてのフォームとサブフォームを引用します。リストの最初の車とcdrだけが実行されます。最初に(cdr '(car (cdr (1 2 3))) - >'((cdr (1 2 3))、次に(car '((cdr (1 2 3))) - >'(cdr (1 2 3))です。

+0

私はあなたが言っていることを理解していると思いますが、私はまだ確実ではありません。多分何が起こるか説明できますか? – StudentProgramee

+0

ああ、そうですね、それは「後方に」行くところです。内部から出発すること。私は引用符で回っていたので、それは私の心の中で切り替えたので、それは意味をなさない!ありがとう! – StudentProgramee

+0

引用符は、囲むリスト全体の評価を停止します。 –

3

ここでの問題は、「見積もり」があなたが思っているよりもずっと強力だということです。

(car (cdr (list (quote car) (list (quote cdr) (list 1 2 3)))) 

に...

(car (cdr '(car (cdr (1 2 3)))) 

からプログラムを書き換える - あなたのプログラムを検討するためのコードの非常に最初の部分 - 特に、引用は「読者」への指示でありますつまり、引用符が流れ落ち、左のすべての括弧が新しいリスト作成に変更され、すべての識別子が引用符で囲まれた記号に変更されます。

識別子以外のもの(たとえば、'abc)に引用符を適用することは、かなり滑りやすい概念であり、通常、リストを使った経験が豊富で、それらを短縮する良い方法を探していると意味があります。

関連する問題