これは私の前の質問のフォローアップです:なぜ nil が必要なのですか? 明らかに、ほとんどの場合適切なリストが使用されます。しかし、不適切なリストの目的は何ですか?
4 に答える
正当な理由はありません。不適切なリストが真に適しているのは、連想リストの構文の一部としてだけです。その場合でも、キーと値のペアのカスタム構文の方が適しています。考えられる不適切なリストの使用法はすべて、レコード型でより適切に実装できます — 結局、これはリストを包含します: レコードに関して Lisp リストを定義することはできますが、その逆はできません (リストでは定義できないため)。型が言語の他のすべての型から切り離されているデータ構造)。
すべてのタイプのデータを表現するためにペアとリストを乱用することを、私はLisp プログラマー病と呼んでいます。非常に多くの Lisp 支持者がそれを支持しているのは本当に残念です。私はそのようなものを何度もクリーンアップしなければなりませんでした。
不適切なリストの存在は、基本的なビルディング ブロックcons
、car
、およびの存在の自然な結果ですcdr
。これら 3 つがあらゆる種類のより複雑なデータ型の基礎を形成するのは、Lisp の中心です。どういうわけか、追放の不適切なリストを選び出すには、恣意的な制限を課す必要があります。
「不適切なリスト」は、 を使用して作成されたリスト以外のデータ型を指すあいまいな用語ですcons
。
John が言うように、1 つの例は、cons
ML でタプルを使用するのと同じ方法でペアを使用することです。
別の例は、リストのバリエーションです。たとえば、次のようにストリームを定義できます。
;; A Stream-of-X is one of
;; - null, ie '()
;; - (cons X Stream-of-X)
;; - a procedure taking no arguments and returning a Stream-of-X result
;; nats-from : nat -> Stream-of-nat
(define (nats-from n)
(cons n (lambda () (nats-from (+ n 1)))))