既存のリストタイプですべてをカバーしている間に、ドットペアタイプをLISPに導入する歴史的な理由は誰に分かっていますか?LISPにドットペアを導入する理由は何ですか?
また、私はドットペアがしばしば私を混乱させるので、これに興味があります。
既存のリストタイプですべてをカバーしている間に、ドットペアタイプをLISPに導入する歴史的な理由は誰に分かっていますか?LISPにドットペアを導入する理由は何ですか?
また、私はドットペアがしばしば私を混乱させるので、これに興味があります。
McCarthyの1960年の論文、"Recursive Functions of Symbolic Expressions and Their Computation By Machine, Part I"をお読みください。
彼はS式を定義することから始めます。規則の1つは、e1がS式でe2がS式である場合、< e1です。 e2>は、点線の対でもあるが、S式である。
数行後、リスト表記法を点線ペアの連鎖で構成された式の省略形として定義します。
これは、最終的にLISPになるものを最初に定義した論文でした。 Steve "Slug" Russellが最初のインタプリタを実装するまでは、実際のプログラミング言語にはなりませんでした。
既存cons
タイプはすべて(リスト関連)をカバーします。点対記法は、単にcons
リテラルの構文です。
あなたの質問にコメントを読むことができるので、点在するペアは既存のリストタイプの隣には導入されませんでした。代わりに、最初のデータ構造として導入され、リストは点線のペアで実装されます。ドット対を選択した理由を、私はそれは、元のLISPシステムは、上で実装されたハードウェアによって導かれたと信じて質問に関しては
:IBM 704としてはthe wikipedia article oncar
and cdr
で読み取ることができますが、それは36ビットを持っていました2つの15ビット・ビットと2つの3ビット・パートの4つの部分でアクセスできます。 システムの設計の詳細については、the History of Lispも参照してください。
私はそうは思わない。ペアはマッカーシーが働いていた数学から来たものであり、マシンからではありませんでした。コンスセルは点在するものではありません。これは、抽象的なペアのマシン実装です。 – Kaz
逆に '(a b c)'は '(a。(b。(c。NIL)))')の構文砂糖に過ぎないので、なぜリスト表記を使うのですか?私は正直にどちらが最初に来たのか分からない。また、リスト記法は点線の表記法のすべてをカバーするものではありません。たとえば、 '(a。b)'のリスト表記はありません。 –
'(a。b)'には本当にリスト表記が必要ですか?私にとっては(私はちょうどLISPの学習を始めたばかりです)代わりに ''(a b) 'を使うことができます:どちらも頭と尾があります。 – bananov
@bananov、 '(a b)'は '(a。(b。NIL))'に相当します。これは確かに大きなデータ構造です。フラットリスト(バイナリツリーの代わりに)のみを許可すると、頭と尾が別の扱いを必要とするため、言語がかなり複雑になります(Clojureがいかにひどくひどいのかを参照)。 –