3

これはおそらく私が見逃している単純なことですがcdr、ペアの を取得しようとしていて、言うすべての呼び出しが(cdr (cons 'a '5))として返され(5)ます。その理由はなんとなくわかりますが、括弧なしでそれを返すにはどうすればよいですか?

flatten取得しようとしているもの (つまり、cdr) 自体が、既に括弧で囲まれた別の手続き式である可能性があるため、使用したくありません。したがって、リストを平坦化したくありません。

let(重要な場合は、式を式に変換する作業を行っていlambdaます。これは、ラムダ バインドを分解して移動できるようにするための手順の 1 つです)。

4

1 に答える 1

7

適切なリストに適用すると、常に別のリスト(空のリストcdrを含む)が返されます。'()

適切なリストとは、空のリストで終わるリストを意味します。たとえば、内部でこれを行うと、これが:に(define lst '(4 5))割り当てられます。したがって、評価すると、最初のの2番目の要素が取得されます。これはたまたまであり、これは。として出力されます。lst(cons 4 (cons 5 '()))(cdr lst)cons(cons 5 '())(5)

リストの2番目の要素のみを抽出する場合(最初の要素の2番目の要素ではなくcons、これが実行さcdrれます)、次のことができます。

  1. コメントで指摘されているように、使用するか、(car (cdr lst))または単に(cadr lst)略して
  2. さらに簡単:使用(second lst)
  3. 別の可能性-リストに2つの要素しかなく、不適切なリストに置き換えても問題がない場合は、(define cell (cons 4 5))またはを使用(define cell '(4 . 5))してconsセルを作成し、を使用(car cell)して最初の要素(cdr cell)を抽出し、2番目の要素を抽出できます。
于 2011-11-20T15:25:05.477 に答える