Lisp(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
舌足らずの発音
Lisplogo.svg
パラダイムマルチパラダイム機能的手続き的反射的メタ
によって設計されたジョン・マッカーシー
デベロッパースティーブ・ラッセル、ティモシー・P・ハート、マイク・レビン
初登場1958 ; 63年前 (1958
規律の入力ダイナミック強い
方言
に影響を受けた
IPL
影響を受ける

Lisp(歴史的にはLISP)は、長い歴史と独特の完全に括弧で囲まれた接頭辞表記を備えたプログラミング言語のファミリーです[3] 1958年に最初に指定されたLispは、2番目に古い高級プログラミング言語です。Fortranだけが1年古いです。[4] [5] Lispは初期の頃から変化しており、その歴史の中で多くの方言が存在してきました。今日、最もよく知られている汎用Lisp方言は、RacketCommon LispScheme、およびClojureです。

Lispは元々コンピュータプログラムの実用的な数学表記として作成されました。これは(元々は派生していませんが)[6]アロンゾチャーチラムダ計算表記に影響されています。それはすぐに人工知能(AI)研究のために好まれるプログラミング言語になりました[7]初期のプログラミング言語の1つとして、Lispはツリーデータ構造自動ストレージ管理動的型付け条件付き高階関数などコンピュータサイエンスの多くのアイデアを開拓しました再帰セルフホスティングコンパイラ[8]read-eval-printループ[9]

名前LISPは「リストプロセッサー」に由来しています。[10] リンクリストはLispの主要なデータ構造の1つであり、Lispソースコードはリストで構成されています。したがって、Lispプログラムはソースコードをデータ構造として操作でき、プログラマーがLispに埋め込まれた新しい構文または新しいドメイン固有言語を作成できるようにするマクロシステムを生み出します

コードとデータの互換性により、Lispはすぐに認識できる構文になります。すべてのプログラムコードは、S式または括弧で囲まれたリストとして記述されています。関数呼び出しまたは構文形式は、最初に関数または演算子の名前を持ち、その後に引数が続くリストとして記述されます。たとえば、f3つの引数を取る関数はとして呼び出されます。 (f arg1 arg2 arg3)

歴史

John McCarthyは、マサチューセッツ工科大学(MIT)に在籍していた1958年にLispを開発しましたマッカーシーは、 1960年Communications of the ACMの論文で、「記号式の再帰関数と機械によるそれらの計算、パートI」というタイトルの論文を発表しました[11]彼は、いくつかの単純な演算子と、Churchから借用した無名関数の表記法を使用して、アルゴリズムのチューリング完全言語を構築できることを示しました

情報処理言語は、1955年または1956年からの最初のAI言語であり、リスト処理や再帰など、Lispで使用されるようになった概念の多くがすでに含まれていました。

マッカーシーの元の記譜法では、S式に変換される括弧で囲まれた「M式」が使用されていました。例として、M式はSと同等です。 Lispが実装されると、プログラマーはすぐにS式を使用することを選択し、M式は放棄されました。 M-式はの短命試みで再び浮上MLisp [12]によってホレスエニアCGOLによってヴォーンプラットcar[cons[A,B]](car (cons A B))

Lispのは最初で実装されたスティーブ・ラッセルIBM 704使用してコンピュータパンチカードを[13] RussellはMcCarthyの論文を読み、(McCarthyの驚いたことに)Lispeval関数をマシンコードで実装できることに気づきました

マッカーシーによると、[14]

「スティーブ・ラッセルは言った、見て、なぜ私はこの評価をプログラムしないのか ...そして私は彼に言った、ホー、ホー、あなたは理論と実践を混同している、この評価はコンピューティングではなく読書を目的としている。しかし彼は行ったつまり、彼は私の論文evalIBM 704マシンコードコンパイルしバグを修正し、これをLispインタープリターとしてアドバタイズしました。今日 ..."

その結果、Lispプログラムを実行したり、より適切には「Lisp式を評価」したりするために使用できるLispインタプリタが機能しました。

IBM 704の2つのアセンブリ言語マクロは、リストを分解するための基本的な操作になりました。レジスター番号のアドレス部分の内容)およびレジスター番号のデクリメント部分の内容[15]ここで、「レジスター」はレジスターのレジスター指します。コンピューターの中央処理装置(CPU)。Lispの方言は、まだ使用し、/ K ɑːr /及び/ K ʊ D ər /carcdrcarcdr)リストの最初の項目とリストの残りの項目をそれぞれ返す操作の場合。

Lispで書かれた最初の完全なLispのコンパイラは、製造、MITでティム・ハートとマイクレヴィンによって1962年に実現され、単に既存のLISPインタプリタは、コンパイラコードを解釈有することをコンパイルすることができたマシンコードで実行することができる出力を通訳の速度の40倍の速度の向上。[16]このコンパイラは、インクリメンタルコンパイルのLispモデルを導入しましたこのモデルでは、コンパイルされた関数とインタプリタされた関数が自由に混在できます。 Hart and Levinのメモで使用されている言語は、McCarthyの以前のコードよりも現代のLispスタイルにはるかに近いものです。

ガベージコレクションルーチンは、1962年以前にMITの大学院生[要出典] ダニエルエドワーズによって開発されました。[17]

1980年代から1990年代にかけて、新しいLisp方言(主にZetaLispやNIL(Lispの新しい実装)などのMaclispの後継)の作業を単一の言語に統合するために多大な努力が払われました。新しい言語であるCommonLispはある程度互換性がありました。それは置き換え方言で(書籍Common Lispの言語は様々な構築の互換性を指摘する)。1994年、ANSIは、 Common Lispの規格では、「言語Common LispのプログラミングANSI X3.226-1994情報技術」を出版しました。

タイムライン

1955年 1960年 1965年 1970年 1975 1980年 1985年 1990年 1995年 2000 2005年 2010年 2015年 2020
 LISP 1、1.5、LISP 2 (放棄)
 Maclisp
 Interlisp
 MDL(プログラミング言語)
 Lisp Machine Lisp
 図式  R5RS  R6RS  R7RS小
 NIL
 ZIL(Zork実装言語)
 Franz Lisp
 Common Lisp
 Le Lisp
 NS
 Chezスキーム
 Emacs Lisp
 AutoLISP
 PicoLisp
 EuLisp
 ISLISP
 OpenLisp
 PLTスキーム  ラケット
 GNU Guile
 Visual LISP
 Clojure
 アーク
 LFE
 Hy

人工知能への接続

創業以来、Lispは、特にPDP-10 [18]システムにおいて人工知能研究コミュニティと密接に関係してきましたLispは、有名なAIシステムSHRDLUで使用されていたプログラミング言語MicroPlannerの実装として使用されました1970年代、AIの研究によって商業的な分派が生まれたため、既存のLispシステムのパフォーマンスがますます大きな問題になりました。[要出典]

系図と変種

60年の歴史の中で、LispはS式言語のコアテーマに多くのバリエーションを生み出してきました。また、各所定の方言は、いくつかの実装-のインスタンスを有することができ、より多くのダースの実装があるCommon Lispは

方言の違いはかなりはっきりしているかもしれません。たとえば、Common Lispはキーワードdefun使用して関数に名前を付けますが、Schemeはを使用しdefineます。[19]ただし、標準化された方言内では、準拠する実装は同じコア言語をサポートしますが、拡張子とライブラリが異なります。

歴史的に重要な方言

  • LISP 1 [20] –最初の実装。
  • LISP 1.5 [21] –MITのMcCarthyらによって開発された最初の広く配布されたバージョン。元の「LISP1」インタープリターにいくつかの改良が加えられたため、このように名付けられましたが、計画されたLISP2のように大きな再構築ではありませんでした
  • Stanford LISP 1.6 [22] –これはStanford AILabで開発されたLISP1.5の後継でありTOPS-10オペレーティングシステムを実行するPDP-10システムに広く配布されましたMaclispとInterLispによって廃止されました。
  • MACLISP [23] – MITのプロジェクトMAC用に開発されたMACLISPは、LISP1.5の直系の子孫です。PDP-10およびMulticsシステムで実行されましたMACLISPは後にMaclispと呼ばれるようになり、MacLispと呼ばれることがよくあります。MACLISPの「MAC」は、AppleのMacintoshにMcCarthyに関連していません
  • Interlisp [24] –TENEXオペレーティングシステムを実行するPDP-10システム用BBNTechnologiesで開発され、後にXeroxLispマシンの「西海岸」LispとしてInterLisp-Dとして採用されました。 「InterLISP65」と呼ばれる小さなバージョンが、6502ベースのAtari8ビットファミリーコンピュータライン用に公開されました。かなり長い間、MaclispとInterLispは強力な競争相手でした。
  • Franz Lisp –元々はカリフォルニア大学バークレー校のプロジェクト。後にフランツ社によって開発されました。この名前は「フランツリストという名前のユーモラスな変形であり、最近ではフランツ社が販売しているCommonLispの方言であるAllegroCommonLispを指していません
  • AutoLISPのベースとなったXLISP
  • StandardLispPortableStandard Lispは、特に数式処理システムREDUCEで広く使用され、移植されました。
  • ZetaLispは、Lisp Machine Lispとも呼ばMaclispの直系の子孫であるLispマシン使用されます。ZetaLispはCommonLispに大きな影響を与えました。
  • LeLispはフランス語のLisp方言です。最初のインターフェースビルダーの1つ(SOSインターフェース[25]と呼ばれる)はLeLispで書かれました。
  • スキーム(1975)。[26]
  • Common Lisp(1984)、Common Lisp the Languageで説明されているように、Schemeからの実質的な影響を受けて、Maclispの後継方言[27]作成するためのいくつかの異なる試み(ZetaLisp、Spice LispNIL、およびS-1 Lisp)の統合方言も。このバージョンのCommonLispは、幅広いプラットフォームで利用可能であり、ANSI Common Lisp(ANSI X3.226-1994)が公開されるまで、事実上の標準として多くの人に受け入れられていました[28]。 Common Lispの最も普及しているサブ方言の中には、Steel Bank CommonLispがあります。(SBCL)、CMU Common Lisp(CMU-CL)、Clozure OpenMCL(Clojureと混同しないでください!)、GNU CLisp、およびそれ以降のバージョンのFranzLisp。それらはすべて、後のANSI CL規格に準拠しています(以下を参照)。
  • Dylanは、最初のバージョンで、SchemeとCommon Lisp ObjectSystemを組み合わせたものでした。
  • EuLisp –新しい効率的でクリーンアップされたLispの開発を試みます。
  • ISLISP –新しい効率的でクリーンアップされたLispの開発を試みます。ISO / IEC 13816:1997 [29]として標準化され、後にISO / IEC 13816:2007として改訂されました。[30] 情報技術–プログラミング言語、その環境、およびシステムソフトウェアインターフェイス–プログラミング言語ISLISP
  • IEEEスキーム– IEEE標準、1178–1990(R1995)。
  • ANSI Common LispCommon Lisp米国規格協会(ANSI)規格であり、小委員会X3J13によって作成されCommon Lisp:The Languageをベースドキュメントとして開始し、パブリックコンセンサスプロセスを通じて解決策を見つけるためにチャーターされています[31]。プログラム移植性CommonLisp実装の互換に関する共通の問題。正式にはANSI規格ですが、ANSI Common Lispの実装、販売、使用、および影響は、世界中で見られ続けています。
  • ACL2または「ApplicativeCommonLispの計算ロジック」、Common LISPの適用可能な(副作用のない)バリアント。ACL2は、コンピューターシステムをモデル化できるプログラミング言語であると同時に、それらのモデルのプロパティを証明するためのツールでもあります。
  • Clojureは、Java仮想マシンにコンパイルされ、並行性に特に重点を置いているLispの最近の方言です
  • 議会のLisp指向ゲーム(またはGOAL)がアンディ・ギャビンとによって開発されたビデオゲームのプログラミング言語でのJakとDaxterのチームノーティードッグAllegro Common Lispを使用して作成され、JakおよびDaxterシリーズのゲーム全体の開発に使用されました
  • Chialisp、Chiaブロックチェーンのオンチェーンプログラミング環境であるCLVMにコンパイルされる高レベルの方言

提示する2000

1990年代にやや衰退した後、Lispは2000年以降、関心の復活を経験しました。ほとんどの新しい活動は、Common LispSchemeEmacs LispClojureRacketの実装に焦点を当てており、新しいポータブルライブラリとアプリケーションの開発が含まれます。

多くの新しいLispのプログラマは、次のような作家に触発されたポール・グレアムエリック・レイモンド時代遅れと見なさ言語他人を追求します。新しいLispプログラマーは、この言語を目を見張るような経験として説明し、他の言語よりも実質的に生産性が高いと主張することがよくあります。[32]この意識の高まりは、「AIの冬」や1990年代半ばのLispの短期間の増加とは対照的かもしれません[33]

2010年の時点で、11のアクティブに維持されているCommonLispの実装がありました。[34] Scieneer Common Lispは、2002年に最初のリリースが行われたCMUCLから分岐した新しい商用実装です。

オープンソースコミュニティは、新しいサポートインフラストラクチャを作成しました:CLikiは、Common Lispの関連情報を収集ウィキあるCommon Lispのディレクトリによってサポート付き(リスト資源、#lispは人気のIRCチャンネルであるとの共有を可能にし、コードスニペットのコメントlisppasteLispで書かれIRCボット)、Planet LispはさまざまなLisp関連のブログのコンテンツを収集します。LispForumユーザーはLispトピックについて話し合います。Lispjobsは求人を発表するためのサービスであり、毎週のニュースサービスであるWeekly LispNewsがありますCommon-lisp.netはオープンソースのCommonLispプロジェクトのホスティングサイトです。Quicklispは、CommonLispのライブラリマネージャーです。

Lispの50年(1958–2008)はLISP50 @OOPSLAで祝われました。[35]ボストン、バンクーバー、ハンブルクで定期的にローカルユーザーミーティングがあります。その他のイベントには、European Common Lisp Meeting、European Lisp Symposium、International LispConferenceなどがあります。

スキームコミュニティは、20を超える実装を積極的に維持しています。いくつかの重要な新しい実装(チキン、ギャンビット、ゴーシュ、イカルス、窃盗、イプシロン)が2000年代(10年)に開発されました。アルゴリズム言語スキームに関する改訂5レポート[36]スキームの標準は、スキームコミュニティで広く受け入れられました。実装プロセスSchemeリクエストは、Schemeの多くの準標準ライブラリと拡張機能を作成しました。個々のScheme実装のユーザーコミュニティは成長を続けています。新しい言語の標準化プロセスは2003年に開始し、Rにつながった62007年のRSスキーム標準。コンピュータサイエンスを教えるためのSchemeの学術的使用はやや減少しているようです。一部の大学では、コンピュータサイエンスの入門コースでSchemeを使用していません。[37] [38] MITは現在、学部のコンピュータサイエンスプログラムとMITxの大規模なオープンオンラインコースにSchemeの代わりにPython使用しています。[39] [40]

Lispにはいくつかの新しい方言があります:ArcHyNuLiskell、およびLFE(Lisp Flavoured Erlang)。JuliaのパーサーはSchemeの方言であるFemtolispに実装されています(JuliaはSchemeに触発されており、SchemeはLisp方言です)。

2019年10月には、ポール・グレアムは解放ベルの仕様を、「Lispの新しい方言を。」

主な方言

Common LispSchemeは、Lisp開発の2つの主要な流れを表しています。これらの言語は、大幅に異なる設計上の選択を具体化しています。

CommonLispMaclispの後継です。主な影響は、Lisp Machine Lisp、Maclisp、NILS-1 LispSpice Lisp、およびSchemeでした。[41]これは、LispマシンLispの(プログラムに使用される大型のLisp方言の機能の多くがあるLispマシンを)が、任意のパーソナルコンピュータやワークステーション上で効率的に実現するように設計されました。 Common Lispは汎用プログラミング言語であるため、多くの組み込みデータ型、関数、マクロ、その他の言語要素、およびオブジェクトシステム(Common Lisp Object Systemを含む大きな言語標準があります。 Common Lispは、Schemeから次のような特定の機能も借用しました。字句スコープ字句クロージャ。 Common Lispの実装は、次のような異なるプラットフォームを標的とするために用意されていLLVM[42]、Java仮想マシン[43] のx86-64、PowerPCの、アルファ、ARM、Motorolaの68000、およびMIPS、[44]およびオペレーティングシステムWindowsのような、macOS、Linux、Solaris、FreeBSD、NetBSD、OpenBSD、Dragonfly BSD、およびHeroku。[45]

Schemeは、Guy L. Steele、Jr。Gerald Jay Sussmanによって発明されたLispプログラミング言語の静的スコープで適切な末尾再帰方言です。これは、非常に明確で単純なセマンティクスと、式を形成するためのいくつかの異なる方法を持つように設計されました。 Common Lispより約10年早く設計された、Schemeはよりミニマリストな設計です。標準機能のセットははるかに少ないですが、特定の実装機能(末尾呼び出しの最適化や完全な継続など)があります)CommonLispで指定されていません。命令型、関数型、メッセージパッシングスタイルなど、さまざまなプログラミングパラダイムが、Schemeで便利な表現を見つけます。スキームは、一連の標準(アルゴリズム言語スキームに関する改訂版nレポート)および一連の実装要求スキームとともに進化し続けています。

Clojureは、主にJava仮想マシン、および共通言語ランタイム(CLR)、Python VM、Ruby VM YARVを対象とし、JavaScriptにコンパイルするLispの最近の方言です実用的な汎用言語として設計されています。ClojureはHaskellからかなりの影響を受けており、不変性を非常に重視しています。[46] Clojureは、オプションの型ヒントと型推論を備えたJavaフレームワークとライブラリへのアクセスを提供するため、Javaの呼び出しはリフレクションを回避し、高速なプリミティブ操作を可能にします。Clojureは、他のLisp方言との下位互換性があるようには設計されていません。[47]

さらに、Lispの方言はとして使用されているスクリプト言語最もよく知られていると、多くのアプリケーションでのEmacs LispののEmacsエディタ、AutoLISPの以降のVisual LispののAutoCAD、ナイキストでのAudacityで、かつスキームLilyPondの。便利なSchemeインタープリターはサイズが小さい可能性があるため、埋め込みスクリプトで特に人気があります。例としては、SIODTinySchemeがあり、どちらも一般名「Script-fu」でGIMP画像プロセッサに正常に埋め込まれています。[48]LIBREP、もともと基づいてジョン・ハーパーのLispインタプリタEmacs Lispの言語は、中に埋め込まれているのsawfish ウィンドウマネージャ[49]

標準化された方言

:Lispは正式方言標準化しているR6RSスキームR7RSスキーム、IEEEスキームを、[50] ANSI Common LispのとISO ISLISP

言語の革新

Lispは、プログラムコードの構造が標準のデータ構造で忠実かつ直接的に表現された最初の言語でした。この品質は後に「同像性」と呼ばれました。したがって、Lisp関数は、低レベルの操作なしでLispプログラム内で操作、変更、または作成することができます。これは一般に、その表現力に関する言語の主な利点の1つと見なされており、構文マクロやメタサーキュラー評価に適した言語になっています

if-then-else構文を使用する条件付きは、FortranコンテキストでMcCarthyによって発明されました。彼はそれをALGOL含めることを提案しましたが、Algol58仕様の一部にはなりませんでした。 Lispの場合、McCarthyはより一般的なcond構造を使用しました[51] Algol 60は、if-then-elseを採用し、普及させました。

Lispは深く影響を受けたアラン・ケイ、開発した研究チームのリーダーのSmalltalkをゼロックスPARCを。そして、LispはSmalltalkの影響を受け、後の方言は1970年代にオブジェクト指向プログラミング機能(継承クラス、インスタンスのカプセル化、メッセージパッシングなど)を採用しました。味のオブジェクトシステムは、概念の導入多重継承ミックスインをCommon Lispのオブジェクトシステムは、多重継承を有するマルチメソッド提供する複数のディスパッチ、およびファーストクラスの汎用機能の柔軟で強力なフォーム得動的ディスパッチ。それは(を含む多くの後続のLispのためのテンプレートとして役立ったスキームしばしばを介して実装されているオブジェクトシステム)メタオブジェクトプロトコル反射 metacircular設計対象システム自体の観点で定義される:LispはSmalltalkの後にのみ第二言語ました(そして今でも数少ない言語の1つです)そのようなメタオブジェクトシステムを所有しています。何年も後、Alan Kayは、これらの機能の合流の結果として、SmalltalkとLispだけが適切に考案されたオブジェクト指向プログラミングシステムと見なすことができると提案しました。[52]

Lispは、自動ガベージコレクションの概念を導入しました。この概念では、システムがヒープウォークして未使用のメモリを探します。世代別ガベージコレクションなどの最新の洗練されたガベージコレクションアルゴリズムの進歩は、Lispでの使用によって刺激されました。[53]

エドガー・W・ダイクストラは、1972年のチューリング賞の講演で次のように述べています。

「いくつかの非常に基本的な原則を基盤として、それ[LISP]は驚くべき安定性を示しました。それに加えて、LISPはある意味で私たちの最も洗練されたコンピュータアプリケーションのかなりの数のキャリアでした。LISPは冗談めかして次のように説明されています。コンピュータを誤用する最も賢い方法」。それは解放の完全な味を伝えるので、私はその説明が素晴らしい褒め言葉だと思います。それは私たちの最も才能のある仲間の多くが以前は不可能だった考えを考えるのを助けました。」[54]

主に初期のコンピューティングハードウェア(初期のマイクロプロセッサを含む)に関するリソース要件のために、LispはFortranALGOLの子孫C言語ほどAIコミュニティの外では普及しませんでした複雑で動的なアプリケーションに適しているため、Lispは2010年代に人気の復活を楽しんでいます。[55]

構文とセマンティクス

:この記事の例はCommon Lispで書かれています(ただし、ほとんどはSchemeでも有効です)。

シンボリック式(S式)

Lispは式指向言語です。他のほとんどの言語とは異なり、「式」と「ステートメント」は区別されません[疑わしい ]すべてのコードとデータは式として書かれています。式が評価されると、値(Common Lispでは、場合によっては複数の値)が生成され、他の式に埋め込むことができます。各値は任意のデータ型にすることができます。

マッカーシーの1958年の論文では、2種類の構文が紹介されています。コードとデータの内部表現を反映するシンボリック式S式、s)。そしてメタ式M-式S-式の機能を発現します)。 M式は決して好まれることはなく、今日のほとんどすべてのLispはS式を使用してコードとデータの両方を操作しています。

括弧の使用は、他のプログラミング言語ファミリーとのLispの最もすぐに明らかな違いです。その結果、学生は長い間、Lost In StupidParenthesesたくさんの刺激的な余分な括弧などのLispニックネームを付けてきました[56]しかし、S式構文はLispの力の多くにも関与しています。構文は非常に規則的であり、コンピューターによる操作を容易にします。ただし、Lispの構文は従来の括弧表記に限定されません。代替表記を含めるように拡張できます。たとえば、XMLispは、メタオブジェクトプロトコル使用してS式をExtensible Markup Language(XMLと統合するCommonLisp拡張機能です

式に依存することで、言語に大きな柔軟性がもたらされます。Lisp関数はリストとして書かれているので、データとまったく同じように処理できます。これにより、他のプログラムを操作するプログラムを簡単に作成できます(メタプログラミング)。多くのLisp方言は、マクロシステムを使用してこの機能を利用します。これにより、言語をほぼ無制限に拡張できます。

リスト

Lispリストは、その要素が空白区切られ、括弧で囲まれて書かれています。例えば、その要素が3個のであるリストである原子、およびこれらの値は暗黙的に型指定されます。これらはそれぞれ2つの整数であり、「シンボル」と呼ばれるLisp固有のデータ型であり、そのように宣言する必要はありません。 (1 2 foo) 12foo

空のリスト()は、特殊なアトムとしても表されnilます。これは、アトムとリストの両方であるLispの唯一のエンティティです。

式は、プレフィックス表記を使用してリストとして記述されますリストの最初の要素は、関数の名前、マクロの名前、ラムダ式、または「特殊演算子」の名前です(以下を参照)。リストの残りの部分は引数です。たとえば、関数listは引数をリストとして返すため、式

 リスト 1  2  引用 foo ))

リストに評価されます前の例のの前の「引用符」は、引数を評価せずに返す「特殊演算子」です。引用符で囲まれていない式は、囲んでいる式が評価される前に再帰的に評価されます。例えば、 (1 2 foo)foo

 リスト 1  2  リスト 3  4 ))

リストに評価されます3番目の引数はリストであることに注意してください。リストはネストできます。 (1 2 (3 4))

演算子

算術演算子も同様に扱われます。表現

 +  1  2  3  4 

10と評価されます。中置記法の下で同等のものは " "になります。 1 + 2 + 3 + 4

Lispには、Algolから派生した言語で実装されているような演算子の概念はありません。Lispの算術演算子は可変引数関数(またはn-ary)であり、任意の数の引数を取ることができます。Cスタイルの「++」インクリメント演算子はincf、構文を与える名前で実装される場合があります

 incf  x 

と同等で(setq x (+ x 1))、の新しい値を返しますx

「特殊演算子」(「特殊形式」と呼ばれることもあります)は、Lispの制御構造を提供します。たとえば、特殊演算子ifは3つの引数を取ります。最初の引数がnil以外の場合、2番目の引数に評価されます。それ以外の場合は、3番目の引数に評価されます。したがって、式

 if  nil 
     list  1  2  "foo" 
     list  3  4  "bar" ))

に評価されます。もちろん、これは、の代わりに自明でない式が置き換えられた場合に、より便利になります(3 4 "bar")nil

Lispは、論理演算子andornotも提供しますし、またはオペレーターが行う短絡評価をそれぞれその最初のゼロと非nilの引数を返します。

 または および "zero"  nil  "never"  "James"  'task  ' time 

「ジェームズ」に評価されます。

ラムダ式と関数定義

別の特別な演算子、はlambda、変数を値にバインドするために使用され、値は式内で評価されます。この演算子は、関数の作成にも使用されます。引数tolambda引数のリストであり、関数が評価される1つまたは複数の式(戻り値は評価される最後の式の値です)。表現

 ラムダ arg  +  arg  1 ))

適用されると、1つの引数を取り、それをバインドしてarg、その引数より1大きい数を返す関数に評価され ます。ラムダ式は、名前付き関数と同じように扱われます。それらは同じ方法で呼び出されます。したがって、式

 ((lambda  arg  +  arg  1 )) 5 

に評価され6ます。ここでは、関数適用を実行しています。値5を渡すことにより無名関数を実行します。

名前付き関数は、defunマクロを使用してラムダ式をシンボルに格納することで作成されます。

 defun  foo  a  b  c  d  +  a  b  c  d ))

(defun f (a) b...)fグローバル環境で指定さた新しい関数を定義します。概念的には次の式に似ています。

 setfの fdefinition  'F  #' ラムダ ブロックF B ... )))   

ここsetfで、は最初の引数の値を新しい関数オブジェクトに設定するために使用されるマクロです。は、という名前の関数のグローバル関数定義です特殊演算子の省略形で、関数オブジェクトを返します。 fdefinition 'ffdefinitionf#'function

アトム

元のLISPにはアトムとリストという2つの基本的なデータ型がありました。リストは要素の有限の順序のシーケンスであり、各要素はアトムまたはリストのいずれかであり、アトムは数値または記号でした。シンボルは本質的に一意の名前付きアイテムであり、ソースコード英数字の文字列として記述され、変数名またはシンボリック処理ではデータアイテムとして使用されていました。たとえば、リストには、記号、リスト、および数値2の3つの要素が含まれています(FOO (BAR 1) 2)FOO(BAR 1)

アトムとリストの本質的な違いは、アトムは不変で一意であるということでした。ソースコードの異なる場所に表示されているが、まったく同じ方法で記述された2つのアトムは、同じオブジェクトを表しています[要出典]。一方、各リストは、他のリストとは独立して変更でき、他のリストと区別できる別個のオブジェクトでした。比較演算子。

後のLisp方言でより多くのデータ型が導入され、プログラミングスタイルが進化するにつれて、アトムの概念は重要性を失いました。[要出典]多くの方言は、レガシー互換性のために述語アトム保持し[要出典]は、短所ではないすべてのオブジェクトに当てはまると定義しています。

要約とリスト

リストのボックスとポインタの図(42 69 613)

Lispリストは単一リンクリストとして実装されています[57]このリストの各セルは、cons(Schemeではペア)と呼ばれ、carcdrと呼ばれる2つのポインター構成されます。これらはそれぞれ、記事のリンクリストで説明されているフィールド同等です。 datanext

consセルから構築できる多くのデータ構造のうち、最も基本的なものの1つは適切なリストと呼ばれます適切なリストは、特別なnil(空のリスト)記号、またはcarデータム(リストなどの別の短所構造である可能性があります)をcdr指す短所と、別の適切なリストを指す短所のいずれかです。

特定の短所がリンクリストの先頭であると見なされる場合、その車はリストの最初の要素を指し、そのcdrはリストの残りの部分を指します。このような理由から、carそしてcdr機能も呼ばれているfirstrestリンクリスト(というよりも、言って、木)の一部であるコンスを参照するとき。

したがって、C ++またはJavaのコンテナクラスのインスタンスのように、Lispリストはアトミックオブジェクトではありません。リストは、リンクされたコンスの集合体にすぎません。特定のリストを参照する変数は、単にリストの最初の短所へのポインターです。リストのトラバースは、リストをcdringすることで実行できますつまり、連続するcdrを使用して、リストの各短所にアクセスします。または、いくつかの高階関数のいずれかを使用して、関数をリストにマップします。

ConsesとリストはLispシステムでは非常に普遍的であるため、それらがLispの唯一のデータ構造であるというのはよくある誤解です。実際、最も単純なLispを除くすべてのデータ構造には、ベクトル(配列)、ハッシュテーブル、構造などの他のデータ構造があります

S式はリストを表します

括弧で囲まれたS式は、リンクリスト構造を表します。同じリストをS式として表すにはいくつかの方法があります。短所は、で書くことができる点線対表記として車であり、CDR。より長い適切なリストは、ドットペア表記で記述れる場合がありますこれは通常リスト表記のよう省略さます不適切なリスト[58]、最後のcdrがである3つのコンスのリスト(つまり、完全に指定された形式のリスト)のように、2つの組み合わせで記述される場合があります(a . b)ab(a . (b . (c . (d . nil))))(a b c d)(a b c . d)d(a . (b . (c . d)))

リスト処理手順

Lispは、リストにアクセスして制御するための多くの組み込みプロシージャを提供します。リストはlist、任意の数の引数を取り、これらの引数のリストを返すプロシージャを使用して直接作成できます。

 リスト 1  2   3 
 ;出力:(1 2 3)
 リスト 1  ' 2  3  4 
 ;出力:(1(2 3)4)

リストがconsペアから構築される方法のため、このconsプロシージャを使用して、リストの先頭に要素を追加できます。consリストの作成方法が原因でプロシージャはリスト引数の処理方法が非対称であることに注意してください

 cons  1  ' 2  3 ))
 ;出力:(1 2 3)
 cons  ' 1  2  ' 3  4 ))
 ;出力:((1 2)3 4)

このappend手順では、2つ(またはそれ以上)のリストを相互に追加します。Lispリストはリンクリストであるため、2つのリストを追加すると時間計算量漸近的になります

 追加 ' 1  2  ' 3  4 ))
 ;出力:(1 2 3 4)
 追加 ' 1  2  3  ' () ' a  ' 5  6 ))
 ;出力:(1 2 3 a 5 6)

共有構造

単純なリンクリストであるLispリストは、相互に構造を共有できます。つまり、2つのリストが同じテール、つまり最終的なコンスのシーケンスを持つことができますたとえば、次のCommonLispコードの実行後:

のsetfの FOO  リスト '  '、B  'C ))
のsetfの バー 短所 ' X  CDRの FOO )))

リストfoobarそれぞれです。ただし、テールは両方のリストで同じ構造です。コピーではありません。コンスセルを指している両方のリストに同じメモリ位置にあります。 (a b c)(x b c)(b c)bc

コピーではなく構造を共有すると、パフォーマンスが大幅に向上します。ただし、この手法は、引数として渡されたリストを変更する関数と望ましくない方法で相互作用する可能性があります。などの交換などによって、1つのリストを変更するcとすることはgoose、他に影響を与えます。

 setf  third  foo  'goose 

これは変更fooするが、これによっても変化する-おそらく予想外の結果。これはバグの原因となる可能性があり、引数を変更する関数は、まさにこの理由で破壊的なものとして文書化されています。 (a b goose)bar(x b goose)

関数型プログラミングの愛好家は、破壊的な関数を避けます。機能的なスタイルを好むScheme方言では、破壊的な機能の名前には、注意の感嘆符、つまり、短所の車を置き換えるset-car!(read set car bangなどの「bang」が付けられています。 Common Lisp方言では、破壊的な機能が一般的です。に相当するものは「車の交換」にset-car!ちなんで名付けられrplacaています。ただし、Common Lispには、setf破壊的な関数の定義と使用を容易にするための特別な機能が含まれているため、この関数はめったに見られません。 Common Lispでよくあるスタイルは、プロトタイピング時に機能的に(破壊的な呼び出しなしで)コードを記述し、安全な場所で最適化として破壊的な呼び出しを追加することです。

自己評価フォームと引用

Lispは、ユーザーが入力した式を評価します。シンボルとリストは、他の(通常はより単純な)式に評価されます。たとえば、シンボルは、名前を付けた変数の値に評価されます。に評価されます。ただし、他のほとんどのフォームはそれ自体を評価します。Lispに入ると、を返します(+ 2 3)555

式をマークして、評価されないようにすることもできます(シンボルやリストに必要な場合)。これは、quote特殊演算子またはその省略形'(1つの引用符)の役割です。たとえば、通常、記号を入力するfooと、対応する変数の値が返されます(または、そのような変数がない場合はエラーが返されます)。リテラル記号を参照するには、または、通常はを入力します。 (quote foo)'foo

Common LispとSchemeはどちらも文字(アクサングラーブ)で入力されバッククォート演算子(Schemeでは準クォートと呼ばれます)もサポートしています。これは、式を評価し、それらの値をコンマの引用符なしとコンマのスプライス演算子を使用して引用符で囲まれたリストに補間できることを除いて、プレーンクォートとほぼ同じです。変数に値がある場合、はに評価され、はに評価されます。バッククォートは、マクロ展開を定義する際に最もよく使用されます。[59] [60]`, ,@ snue(bar baz)`(foo ,snue)(foo (bar baz))`(foo ,@snue)(foo bar baz)

自己評価形式と引用形式は、Lispのリテラルに相当します。プログラムコード内の(可変)リテラルの値を変更できる場合があります。たとえば、関数が引用符で囲まれたフォームを返し、その関数を呼び出すコードがフォームを変更した場合、これにより、後続の呼び出しでの関数の動作が変わる可能性があります。

defun  should-be-constant  ()
  ' 1  2  3 ))

let  ((stuff  should-be-constant )))
  setf  third  stuff  'bizarre ))   ; 悪い!

一定である必要があります   ; 戻ります(1つ2つの奇妙な)

このように引用符で囲まれた形式を変更することは、一般に悪いスタイルと見なされ、ANSI Common Lispによってエラーとして定義されます(ファイルコンパイラは同様の定数を合体させ、書き込み保護されたメモリに配置できるため、コンパイルされたファイルで「未定義」の動作が発生します。 NS。)。

Lispの引用の形式化は自己参照の哲学的アイデアの例として、ダグラス・ホフスタッターゲーデル、エッシャー、バッハ)などによって指摘されています

スコープとクロージャ

Lispファミリーは、動的または静的(別名レキシカル)スコープの使用に分割されますClojure、Common Lisp、Schemeはデフォルトで静的スコープを使用しますが、newLISPPicolisp、およびEmacsAutoCADの埋め込み言語は動的スコープを使用します。バージョン24.1以降、Emacsは動的スコープと字句スコープの両方を使用しています。

プログラムコードのリスト構造。マクロとコンパイラによる悪用

Lispと他の言語の基本的な違いは、Lispでは、プログラムのテキスト表現は、によって使用されるのと同じ内部データ構造(リンクリスト、記号、数値、文字など)の人間が読める形式の記述であるということです。基礎となるLispシステム。

Lispはこれを使用して非常に強力なマクロシステムを実装します。Cなどの他のマクロ言語と同様に、マクロはコンパイル可能なコードを返します。ただし、Cマクロとは異なり、マクロはLisp関数であるため、Lispの能力を最大限に活用できます。

さらに、Lispコードはリストと同じ構造を持っているので、マクロはその言語のリスト処理関数のどれでも構築することができます。要するに、Lispがデータ構造に対して行うことができることは何でも、Lispマクロはコードに対して行うことができます。対照的に、他のほとんどの言語では、パーサーの出力は純粋に言語実装の内部にあり、プログラマーが操作することはできません。

この機能により、言語内で効率的な言語を簡単に開発できます。たとえば、Common Lisp Object Systemは、マクロを使用して言語拡張としてクリーンに実装できます。これは、アプリケーションが別の継承メカニズムを必要とする場合、別のオブジェクトシステムを使用できることを意味します。これは、他のほとんどの言語とはまったく対照的です。たとえば、Javaは多重継承をサポートしておらず、それを追加する合理的な方法はありません。

単純なLisp実装では、このリスト構造はプログラムを実行するために直接解釈されます。関数は文字通り、インタプリタが実行する際にトラバースするリスト構造の一部です。ただし、ほとんどの実質的なLispシステムにはコンパイラも含まれています。コンパイラは、リスト構造をマシンコードまたはバイトコードに変換して実行します。このコードは、Cなどの従来の言語でコンパイルされたコードと同じ速度で実行できます。

マクロはコンパイルステップの前に展開されるため、いくつかの興味深いオプションが提供されます。プログラムに事前計算されたテーブルが必要な場合、マクロはコンパイル時にテーブルを作成する可能性があるため、コンパイラはテーブルを出力するだけで、実行時にテーブルを作成するためにコードを呼び出す必要はありません。一部のLisp実装には、eval-whenコンパイル時(マクロが必要とする場合)にコードを存在させることができるメカニズムがありますが、出力されたモジュールには存在しません。[61]

評価とread-eval-printループ

Lisp言語は、多くの場合統合開発環境(IDE)と組み合わせることができるインタラクティブなコマンドライン使用されます。ユーザーはコマンドラインで式を入力するか、IDEに式をLispシステムに送信するように指示します。Lispは入力された式を読み取りそれらを評価し、結果出力します。このため、Lispコマンドラインはread-eval-printループREPLと呼ばれます。

REPLの基本的な操作は次のとおりです。これは、引用符やマクロなど、実際のLispの多くの要素を省略した単純な説明です。

このread関数は、テキストのS式を入力として受け入れ、それらを内部データ構造に解析します。たとえば、プロンプトでテキストを入力すると、これが3つの要素(記号、数字1、数字2)を持つリンクリストに変換されます。このリストもLispコードの有効な部分です。つまり、評価することができます。これは、リストの車が関数、つまり加算演算を指定しているためです。 (+ 1 2)read+

fooaは単一のシンボルとして読み取られることに注意してください123数123として読み取られます。"123"文字列「123」として読み取られます。

このeval関数はデータを評価し、結果として0個以上の他のLispデータを返します。評価は解釈を意味する必要はありません。一部のLispシステムは、すべての式をネイティブマシンコードにコンパイルします。ただし、評価を解釈として説明するのは簡単です。車が関数に名前を付けるリストを評価するには、eval最初にcdrで指定された各引数を評価し、次に関数を引数に適用します。この場合、関数は加算であり、それを引数リストに適用すると、答えが得られますこれは評価の結果です。 (1 2)3

シンボルfooは、シンボルfooの値に評価されます。文字列「123」のようなデータは同じ文字列に評価されます。リストはリスト(1 2 3)に評価されます。 (quote (1 2 3))

printユーザーへの出力を表すのは関数の仕事ですこのような単純な結果の場合、簡単3です。リスト構造の一部に評価された式でprintは、リストトラバースしてS式として出力する必要があります。

Lisp REPLを実装するには、これら3つの関数と無限ループ関数を実装するだけで済みます。(当然、の実装はeval複雑なります。これは、ifまたはなどのすべての特殊な演算子も実装する必要があるためlambdaです。)これにより、基本的なREPLは1行のコードになります(loop (print (eval (read))))

Lisp REPLは通常、入力編集、入力履歴、エラー処理、およびデバッガーへのインターフェースも提供します。

Lispは通常熱心に評価さます。Common Lispの、引数が評価されるApplicativeのためにいる間、(「左端の最も内側」)スキームの引数の順序コンパイラによる最適化の余地を残して、定義されていません。

制御構造

Lispには元々制御構造がほとんどありませんでしたが、言語の進化の過程でさらに多くの制御構造が追加されました。(Lispの元の条件演算子cond、は、後のif-then-else構造の前身です。)

スキーム方言のプログラマーは、末尾再帰を使用してループを表現することがよくあります。アカデミックコンピュータサイエンスにおけるSchemeの共通性により、一部の学生は末尾再帰がLispで反復を記述する唯一の、または最も一般的な方法であると信じるようになりましたが、これは正しくありません。よく見られるLisp方言はすべて、SchemeのdoループからCommon Lispの複雑なloopまで、命令型の反復構造を持っています。さらに、これを主観的な問題ではなく客観的な問題にする重要な問題は、Schemeが末尾呼び出しの処理に特定の要件を設定することです。、したがって、Schemeで末尾再帰の使用が一般的に推奨される理由は、その慣習が言語定義によって明示的にサポートされているためです。対照的に、ANSI Common Lispは、一般に末尾呼び出しの除去と呼ばれる最適化を必要としません[62]。このように、より伝統的な使用のためのカジュアルな代替として末尾再帰スタイルという事実反復(のような構造dodolistまたはがloop)推奨され[63]以来(Common Lispの中では、文体の好みの問題だけではなく、効率の潜在的に1 Common Lispでの明らかな末尾呼び出しは、単純なジャンプとしてコンパイルされない場合があります)およびプログラムの正確性(末尾再帰はCommon Lispでのスタック使用を増加させる可能性があるため、リスクがあります)スタックオーバーフロー)。

一部のLisp制御構造は、他の言語の構文キーワードと同等の特殊な演算子です。これらの演算子を使用する式の表面的な外観は関数呼び出しと同じですが、引数が必ずしも評価されるとは限らないという点で異なります。反復式の場合は、複数回評価される可能性があります。

他のほとんどの主要なプログラミング言語とは対照的に、Lispはその言語を使用して制御構造を実装することを可能にします。いくつかの制御構造はLispマクロとして実装されており、それらがどのように機能するかを知りたいプログラマーがマクロ拡張することもできます。

Common LispとSchemeの両方に、非ローカル制御フローの演算子があります。これらの演算子の違いは、2つの方言の最も深い違いの一部です。 Schemeはプロシージャを使用した再入可能な継続サポートcall/ccます。これにより、プログラムは実行中の特定の場所を保存(および後で復元)できます。 Common Lispはリエントラント継続をサポートしていませんが、エスケープ継続を処理するいくつかの方法をサポートしています。

多くの場合、同じアルゴリズムを命令型または機能型のいずれかでLispで表現できます。上記のように、Schemeは、制御フローを表現するために末尾再帰と継続を使用する機能的なスタイルを好む傾向があります。ただし、命令型のスタイルはまだかなり可能です。多くのCommonLispプログラマーが好むスタイルは、Cなどの構造化言語に慣れているプログラマーには馴染みがあるように見えるかもしれませんが、Schemersが好むスタイルは、Haskellなどの純粋関数型言語によく似ています。

Lispはリスト処理の初期の遺産であるため、シーケンスの反復に関連する高階関数を幅広く備えています。forLispの他の言語(Cのループなど)で明示的なループが必要になる多くの場合、同じタスクを高階関数で実行できます。(同じことが多くの関数型プログラミング言語にも当てはまります。)

良い例は、SchemeではSchemeと呼ばmapれ、CommonLispではと呼ばれる関数mapcarです。関数と1つ以上のリストを指定mapcarすると、関数をリストの要素に順番に適用し、結果を新しいリストに収集します。

 mapcar  # ' +  ' 1  2  3  4  5  ' 10  20  30  40  50 ))

これ+により、対応するリスト要素の各ペアに関数が適用され、結果が得られます。 (11 22 33 44 55)

CommonLispコードの例を次に示します。

基本的な「Hello、World!」プログラム:

「Hello、World!」を印刷してください 

Lisp構文は自然に再帰に役立ちます。再帰的に定義された集合の列挙などの数学的問題は、この表記法で簡単に表現できます。たとえば、数値の階乗を評価するには

defun  factorial  n 
    if  zerop  n  1 
        *  n  factorial  1-  n )))))

基盤となるLispシステムが末尾再帰を最適化する場合、代替実装は以前のバージョンよりも少ないスタックスペースを使用します

defun  factorial  n  &optional  acc  1 ))
    if  zerop  n  acc 
        factorial  1-  n  *  acc  n ))))

使用反復バージョンで上記の例対比のCommon Lisploopマクロ。

defun  factorial  n 
    ループ for  i  from  1  to  n 
        for  fac  =  1  then  *  fac  i 
        finally  return  fac )))

次の関数はリストを逆にします。(Lispの組み込み関数は同じことをします。)

defun  -reverse  list 
    let  ((return-value ))
      dolist  e  list  push  e  return-value ))
      return-value ))

オブジェクトシステム

Lispの上、横、または中に、次のようなさまざまなオブジェクトシステムとモデルが構築されています。

も参照してください

参考文献

  1. ^ 「はじめに」ジュリアマニュアルドキュメントを読んでください。アーカイブされたオリジナルの2016年4月8日に2016年1210日取得
  2. ^ 「Wolfram言語のQ&A」WolframResearch 2016年1210日取得
  3. ^ エドウィン・D・ライリー(2003)。コンピュータサイエンスと情報技術のマイルストーングリーンウッド出版グループ。pp。156–157。ISBN 978-1-57356-521-9
  4. ^ 「SICP:序文」2001年7月27日にオリジナルからアーカイブされましLispは生存者であり、約四半世紀にわたって使用されてきました。アクティブなプログラミング言語の中で、Fortranだけが長寿命でした。
  5. ^ 「結論」2014年4月3日にオリジナルからアーカイブされまし取得した2014年6月4日に
  6. ^ "通訳者の芸術、またはモジュール性複合体(パートゼロ、1、および2)、パートゼロ、P。4"MITライブラリ。hdl1721.1 / 6094 20208月1取得
  7. ^ 「人工知能のトッププログラミング言語」人工知能プロ。2020-10-30にオリジナルからアーカイブされました2021-02-15を取得
  8. ^ ポール・グレアム。「オタクの復讐」取得した2013年3月14日を
  9. ^ Chisnall、David(2011-01-12)。影響力のあるプログラミング言語、パート4:Lisp
  10. ^ ジョーンズ、ロビン; メイナード、クライヴ; スチュワート、イアン(2012年12月6日)。Lispプログラミングの芸術シュプリンガーサイエンス&ビジネスメディア。NS。2. ISBN 9781447117193
  11. ^ ジョンマッカーシー。「S式の再帰関数と機械によるそれらの計算、パートI」2013-10-04にオリジナルからアーカイブされまし2006年10月13日取得
  12. ^ デビッド・キャンフィールド・スミス。「MLISPユーザーズマニュアル」(PDF)2006年10月13日取得
  13. ^ ジョンマッカーシー(1979年2月12日)。「Lispの歴史:人工知能研究所」(PDF)
  14. ^ ポール・グレアムハッカー&画家、P。185
  15. ^ ジョンマッカーシー。「LISPの先史時代-1956年夏から1958年夏まで」取得した2010年3月14日を
  16. ^ ティム・ハートとマイク・レビン。「AIMemo39-新しいコンパイラ」(PDF)2020年12月13日にオリジナル(PDF)からアーカイブされました2019-03-18を取得しました
  17. ^ マッカーシー、ジョン; アブラハム、ポールW。; エドワーズ、ダニエルJ。; ハート、ティモシーP。; Levin、Michael I.(1962、(15th Printing、1985))。LISP 1.5プログラマーズマニュアル(第2版)(PDF)NS。序文。 で日付値を確認します|date=ヘルプ
  18. ^ PDP-6 / PDP-10の36ビットワードサイズは、1つのワードに2つのLisp18ビットポインタがあることの有用性に影響されました。ピーターJ.ハーレー(1990年10月18日)。「TOPSの歴史または高速ACでの生活」ニュースグループ:  alt.folklore.computersUsenet:[email protected]PDP-6プロジェクトは、1963年初頭に24ビットマシンとして開始されました。設計目標であるLISPでは36ビットに成長しました。 
  19. ^ Common Lisp:(defun f (x) x)
    スキーム:(define f (lambda (x) x))または(define (f x) x)
  20. ^ マッカーシー、J。; ブレイトン、R。; エドワーズ、D。; フォックス、P。; Hodes、L .; ラッカム、D。; Maling、K .; パーク、D。; ラッセル、S。(1960年3月)。「LISPIプログラマーマニュアル」(PDF)ボストンマサチューセッツ州:人工知能グループ、MIT計算センターや研究所。2010年7月17日にオリジナル(PDF)からアーカイブされました。 引用ジャーナルには|journal=ヘルプが必要です 2010年5月11日にアクセス。
  21. ^ マッカーシー、ジョン; アブラハム、ポールW。; エドワーズ、ダニエルJ。; ハート、ティモシーP。; Levin、Michael I.(1985)[1962]。LISP 1.5プログラマーズマニュアル(第2版)。MITプレスISBN 0-262-13011-4
  22. ^ Quam、Lynn H。; ディフル、ホイットフィールド。スタンフォードLISP1.6マニュアル(PDF)
  23. ^ 「Maclispリファレンスマニュアル」3月3日、1979年からのアーカイブの元2007-12-14に。
  24. ^ Teitelman、ウォーレン(1974)。InterLispリファレンスマニュアル(PDF)20066月2日にオリジナル(PDF)からアーカイブされまし2006年8月19日取得
  25. ^ Outils degeneration d'interfaces:etat de l'art et H. ElMrabetによる分類
  26. ^ ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf [永続的なデッドリンク]
  27. ^ Steele、Guy L.、Jr。(1990)「目的」Common Lisp the Language(第2版)。ISBN 0-13-152414-3
  28. ^ カントロウィッツ、マーク; マーゴリン、バリー(1996年2月20日)。「歴史:Lispはどこから来たのですか?」FAQ:Lispのよくある質問2/7
  29. ^ 「ISO / IEC13816:1997」Iso.org。2007-10-01 2013年11月15取得
  30. ^ 「ISO / IEC13816:2007」Iso.org。2013-10-30 2013年11月15取得
  31. ^ 「X3J13憲章」
  32. ^ 「Lisp調査への道」アーカイブされた2006-10-04に2006年10月13日取得
  33. ^ 「未来への傾向」Faqs.org。アーカイブされたオリジナルの2013年6月3日に2013年11月15取得
  34. ^ ウェインレブ、ダニエル。「CommonLispの実装:調査」2012年4月21日にオリジナルからアーカイブされまし2012年4月4日取得
  35. ^ "LISP50 @OOPSLA"Lisp50.org 2013年11月15取得
  36. ^ ドキュメント:標準:R5RSSchemars.org(2012-01-11)。2013年7月17日に取得。
  37. ^ 「MITが学部のCSプログラムにスキームの代わりにPythonを使用する理由」cemerick.com2009年3月24日。2010年9月17日のオリジナルからアーカイブ2013年11月10日取得
  38. ^ Broder、Evan(2008年1月8日)。「時代の終わり」mitadmissions.org 2013年11月10日取得
  39. ^ 「MITEECS学部プログラム」www.eecs.mit.eduMIT電気工学およびコンピュータサイエンス2018年12月31日取得
  40. ^ 「MITx入門Pythonコースは120万人の登録に達しました」MITEECSMIT電気工学およびコンピュータサイエンス2018年12月31日取得
  41. ^ 第1.1.2章、歴史、ANSICL規格
  42. ^ [1] Claspは、C ++と相互運用し、ネイティブコードへのジャストインタイムコンパイル(JIT)にLLVMを使用するCommonLisp実装です。
  43. ^ [2]「ArmedBearCommon Lisp(ABCL)は、JVMで実行される、インタープリターとコンパイラーの両方を備えたCommonLisp言語の完全な実装です。」
  44. ^ [3] Wayback Machine Common Lisp実装で2018-06-22にアーカイブ:調査
  45. ^ [4]活発に開発されたCommonLisp実装の比較
  46. ^ Clojureコレクションの詳細、2012年6月24日取得
  47. ^ 「Clojure合理的」2019年8月27日取得Clojureは下位互換性に制約されないLispです
  48. ^ Script-fu GIMP 2.4で、2009年10月29日取得
  49. ^ Sawfish Wikiaのlibrep、2009年10月29日取得
  50. ^ 「IEEEスキーム」IEEE1178-1990-Schemeプログラミング言語のIEEE標準2019年8月27日取得
  51. ^ 「LISP先史時代-1956年夏から1958年夏まで」1957年から58年にかけてMITでIBM704用にFORTRANで作成した一連のチェスの合法的な移動ルーチンに関連して条件式を発明しました...条件式を定義し、Algolでの使用を提案する論文がACMのCommunicationsに送信されました。しかし、それは非常に短かったので、編集者への手紙に恣意的に降格されました。
  52. ^ 「Dr.AlanKayによる「オブジェクト指向プログラミング」の意味」。 2003-07-23。当時、私は有形メタ言語のモンスターLISPのアイデアを理解していませんでしたが、拡張可能な言語についてのアイデアに少し近づきました...これの第2段階は、最終的にLISPを理解し、この理解を使用して、より良く、より小さく、より多くのものを作ることでした。強力でより遅いバインドの下部構造...私にとってのOOPとは、メッセージング、ローカルの保持と保護、および状態プロセスの非表示、およびすべてのものの極端な遅いバインドのみを意味します。 SmalltalkとLISPで実行できます。これが可能な他のシステムもあるかもしれませんが、私はそれらを知りません。
  53. ^ リーバーマン、ヘンリー; Hewitt、Carl(1983年6月)、「オブジェクトの寿命に基づくリアルタイムガベージコレクター」Communications of the ACM26(6):419–429、CiteSeerX 10.1.1.4.8633doi10.1145 / 358141.358147hdl1721.1 / 6335S2CID 14161480  
  54. ^ Edsger W. Dijkstra(1972)、The Humble Programmer(EWD 340) (ACMチューリング賞講演)。
  55. ^ 「ClojureとLispの復活の概観」
  56. ^ 「Jargonファイル-Lisp」2006年10月13日取得
  57. ^ Sebesta、Robert W.(2012)。" " 2.4関数型プログラミング:LISP ";" 6.9リスト型 ";" 15.4最初の関数型プログラミング言語:LISP " "。プログラミング言語の概念(印刷)(第10版)。米国マサチューセッツ州ボストン:Addison-Wesley。pp。47–52、281–284、677–680。ISBN  978-0-13-139531-2
  58. ^ 注意:いわゆる「点線のリスト」は、「不適切なリスト」の一種にすぎません。もう1つの種類は、consセルがループを形成する「循環リスト」です。通常、これは#n =(...)を使用して表され、複数の参照を持つターゲットconsセルを表し、#n#はこの短所を参照するために使用されます。たとえば、(#1 =(ab)。#1#)は通常((ab)ab)として印刷されます(円形構造の印刷は有効になりません)が、consセルの再利用が明確になります。#1 =(a。#1#)は円形であるため、通常は印刷できませんが、(a ...)が表示されることもありますが、#1 =で定義されるconsセルのCDRはそれ自体です。
  59. ^ 「CSE341:スキーム:引用、準引用、およびメタプログラミング」Cs.washington.edu。1999-02-22 2013年11月15取得
  60. ^ LispでQuasiquotation アーカイブで2013年6月3日ウェイバックマシン、アランBawden
  61. ^ 評価の時間-CommonLispExtensionsGnu.org。2013年7月17日に取得。
  62. ^ 3.2.2.3意味制約Common LispのHyperSpec
  63. ^ 4.3。でコントロール抽象化(イテレーション対再帰)スタイルのプログラミング良いLispの上のチュートリアルケント・ピットマンピーター・ノーヴィグ、8月、1993。
  64. ^ Bobrow1986の17ページ
  65. ^ Veitch、p 108、1988

さらに読む

外部リンク

歴史
協会と会議
本とチュートリアル
インタビュー
資力