4

アイテムのシーケンス(いわゆる適切なリスト)をnilいつ行う必要があるのか​​[1]がわかりません。consいわゆる不適切なリスト(cons末尾のない-edペアnil)だけを使用することで、同じ目標を達成できるように思われます。Lisps [2]は、aとアトムを区別するための基本的なプロシージャをすでに提供しているためpair?(一部の実装ではatom?)、たとえば、リストでプロシージャを定義するときに、length以下に示すように、点線のペアだけで同じことができます。 :

(define len
  (lambda (l)
    (cond ((pair? l) (+ 1 (len (cdr l))))
          (else 1) ) ) )

従来のとは対照的に'(1 . (2 . 3))、期待される答えを得るために、この手順を不適切なリストに適用できることは明らかです。3(length '(1 2 3))

の必要性を弁護するご意見をお聞かせnilください。前もって感謝します。

nil[1] / NIL'()との間の議論は無視しましょう()

[2]ここでは、Lispファミリーの言語を意味します。

4

2 に答える 2

20

nil(または)なしでリストを操作'()することは、ゼロなしで算術演算を実行するようなものです。なしのペアのみを使用してnil、空のリストまたはシングルトンリストをどのように表現します'(1)か?

さらに悪いことに、リストはアトムのリストである必要はありませんが、他のリストを含めることができるので、ネストされたリストをどのように表現します'(1 2 (3 4))か?次の変換を行う場合:

'(3 4) => '(3 . 4)
'(1 2 x) => '(1 . (2 . x)) == '(1 2 . x)

我々が得る:

'(1 2 (3 4)) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)

だけでなく:

'(1 2 3 4) => '(1 . (2 . (3 . 4))) == '(1 2 3 . 4)

したがって、ペアのみを使用してリストを作成nilし、少なくともリストの最後で、ネストされたリスト構造とフラットリストを区別することを妨げません。最後の要素を除く任意の要素としてネストされたリストを含めることができるため、リストの要素が何であるかについて、奇妙で恣意的な制限があります。

より理論的には、適切なリストは帰納的に定義されたデータ型です。リストは空のリストであるか、first任意の要素を持つ要素と、rest常に同じ方法で定義された別のリストである。空のリストを削除すると、データ型が別のリストになるか、リストの最後の要素になる可能性がありますrest に渡す以外にわかりませんpair?。これは、上記のネストされたリストの問題につながります。維持することで、リスト要素として好きなものを使用でき、、、などnilを区別できます。1'(1)'((1))

于 2012-01-30T10:46:23.410 に答える
1

「何もない」を表すために必要です。

于 2012-01-30T20:45:14.783 に答える