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

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
舌足らずの発音
Lisplogo.svg
パラダイムマルチパラダイム機能的手続き的、反射的メタ
によって設計されたジョン・マッカーシー
デベロッパースティーブ・ラッセル、ティモシー・P・ハート、マイク・レビン
初登場1958 ; 64年前 (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という名前は「LIStプロセッサ」に由来しています。[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式は、HoraceEneaによるMLisp [12]VaughanPrattによるCGOLの短期間の試みで再び浮上しましcar[cons[A,B]](car (cons A B))

Lispは、パンチカードを使用してIBM704コンピューターにSteveRussellによって最初に実装まし[13] RussellはMcCarthyの論文を読み、(McCarthyの驚いたことに)Lispeval関数をマシンコードで実装できることに気づきました。

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

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

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

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

Lispで書かれた最初の完全なLispコンパイラは、1962年にMITのTimHartとMikeLevinによって実装され、既存のLISPインタプリタにコンパイラコードを解釈させるだけでコンパイルでき、通訳の速度の40倍の速度の向上。[16]このコンパイラは、インクリメンタルコンパイルのLispモデルを導入しました。このモデルでは、コンパイルされた関数とインタプリタされた関数が自由に混在できます。Hart and Levinのメモで使用されている言語は、McCarthyの以前のコードよりも現代のLispスタイルにはるかに近いものです。

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

1980年代から1990年代にかけて、新しいLisp方言(主にZetaLispやNIL(Lispの新しい実装)などのMaclispの後継)の作業を単一の言語に統合するために多大な努力が払われました。新しい言語であるCommonLispはある程度互換性がありました。方言を置き換えました(Common Lisp the Languageは、さまざまな構造の互換性について説明しています)。1994年、ANSIはCommonLisp標準「ANSIX3.226-1994Information Technology ProgrammingLanguageCommonLisp」を公開しました。

タイムライン

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
 MITスキーム
 T
 シェスキーム
 Emacs Lisp
 AutoLISP
 PicoLisp
 EuLisp
 ISLISP
 OpenLisp
 PLTスキーム  ラケット
 GNU Guile
 Visual LISP
 Clojure
 アーク
 LFE
 ハイ

人工知能への接続

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

系図と変種

60年の歴史の中で、LispはS式言語のコアテーマに多くのバリエーションを生み出してきました。さらに、与えられた方言にはそれぞれいくつかの実装がある場合があります。たとえば、 CommonLispの実装は12以上あります

方言の違いはかなりはっきりしているかもしれません。たとえば、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 。
  • StandardLispPortableStandardLispは、特に数式処理システム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 BankCommonLispがあります。(SBCL)、CMU Common Lisp(CMU-CL)、Clozure OpenMCL(Clojureと混同しないでください!)、GNU CLisp、およびそれ以降のバージョンのFranzLisp。それらはすべて、後のANSI CL規格に準拠しています(以下を参照)。
  • Dylanは、最初のバージョンで、SchemeとCommon LispObjectSystemを組み合わせたものでした。
  • EuLisp –新しい効率的でクリーンアップされたLispの開発を試みます。
  • ISLISP –新しい効率的でクリーンアップされたLispの開発を試みます。ISO / IEC 13816:1997 [29]として標準化され、後にISO / IEC 13816:2007として改訂されました。[30] 情報技術–プログラミング言語、その環境、およびシステムソフトウェアインターフェイス–プログラミング言語ISLISP
  • IEEEスキーム– IEEE標準、1178–1990(R1995)。
  • ANSI Common Lisp – Common Lispの米国規格協会(ANSI)規格であり、小委員会X3J13によって作成され、 Common Lisp:The Languageをベースドキュメントとして開始し、パブリックコンセンサスプロセスを通じて解決策を見つけるためにチャーターされました[31] 。プログラムの移植性とCommonLisp実装の互換性に関する共通の問題。正式にはANSI規格ですが、ANSI Common Lispの実装、販売、使用、および影響は、世界中で見られ続けています。
  • ACL2または「ApplicativeCommonLispの計算ロジック」、Common LISPの適用可能な(副作用のない)バリアント。ACL2は、コンピューターシステムをモデル化できるプログラミング言語であると同時に、それらのモデルのプロパティを証明するためのツールでもあります。
  • Clojureは、 Java仮想マシンにコンパイルされ、並行性に特に重点を置いているLispの最近の方言です
  • Game Oriented Assembly Lisp (またはGOAL)は、AndyGavinとNaughtyDogのJakandDaxterチームによって開発されたビデオゲームプログラミング言語です。Allegro Common Lispを使用して作成され、JakおよびDaxterシリーズのゲーム全体の開発に使用されました。
  • Chialisp、Chiaブロックチェーンのオンチェーンプログラミング環境であるCLVMにコンパイルされる高レベルの方言

提示する2000

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

多くの新しいLispプログラマーは、 PaulGrahamEricS. Raymondなどの作家に触発されて、他の人が時代遅れだと考えている言語を追求しました。新しいLispプログラマーは、この言語を目を見張るような経験として説明し、他の言語よりも実質的に生産性が高いと主張することがよくあります。[32]この意識の高まりは、「 AIの冬」や1990年代半ばのLispの短期間の増加とは対照的かもしれません。[33]

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

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

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

スキームコミュニティは、20を超える実装を積極的に維持しています。いくつかの重要な新しい実装(チキン、ギャンビット、ゴーシュ、イカルス、窃盗、イプシロン)が2000年代(10年)に開発されました。アルゴリズム言語スキームに関する改訂5レポート[36]スキームの標準は、スキームコミュニティで広く受け入れられました。実装プロセスのSchemeリクエストは、Schemeの多くの準標準ライブラリと拡張機能を作成しました。個々のScheme実装のユーザーコミュニティは成長を続けています。2003年に新しい言語標準化プロセスが開始され、 R6に至りました。2007年の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月、PaulGrahamはBelの仕様「Lispの新しい方言」 をリリースしました。

主な方言

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

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

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

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

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

標準化された方言

Lispは公式に標準化された方言を持っています:R6RSスキームR7RSスキーム、IEEEスキーム、[50] ANSICommonLispおよびISOISLISP

言語の革新

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

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

Lispは、 XeroxPARCでSmalltalk開発した研究チームのリーダーであるAlanKayに深く影響を与えましたそして、LispはSmalltalkの影響を受け、後の方言は1970年代にオブジェクト指向プログラミング機能(継承クラス、インスタンスのカプセル化、メッセージパッシングなど)を採用しました。フレーバーオブジェクトシステムは、多重継承とミックスインの概念を導入ましCommon Lisp Object Systemは、多重継承、多重ディスパッチを備えたマルチメソッド、およびファーストクラスのジェネリック関数を提供し、柔軟で強力な形式の動的ディスパッチを生成します。これは、メタオブジェクトプロトコルを介して実装されることが多い後続の多くのLisp(Schemeを含む)オブジェクトシステムのテンプレートとして機能します。これは、オブジェクトシステムがそれ自体で定義される反射メタサーキュラーデザインです。LispはSmalltalkに続く2番目の言語にすぎませでし(そして今でも数少ない言語の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式)。S式の機能を表現するメタ式M式)。M式は決して好まれることはなく、今日のほとんどすべてのLispはS式を使用してコードとデータの両方を操作しています。

括弧の使用は、他のプログラミング言語ファミリーとのLispの最もすぐに明らかな違いです。その結果、学生は長い間、Lost InStupidParenthesesたくさんの刺激的な余分な括弧などの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 ))

リストに評価されます前の例のの前の「quote」は、引数を評価せずに返す「特殊演算子」です。引用符で囲まれていない式は、囲んでいる式が評価される前に再帰的に評価されます。例えば、 (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)であり、任意の数の引数を取ることができます。incfCスタイルの「++」インクリメント演算子は、構文を与える 名前で実装される場合があります

 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は論理演算子andorおよびnotも提供します。andおよびor演算子は短絡評価を行い、それぞれ最初のnil引数とnon-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  #' lambda a block 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はリストの残りの部分を指します。このため、carandcdr関数も呼び出されfirstrestリンクリストの一部であるconsesを参照する場合(たとえば、ツリーではなく)。

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

ConsesとリストはLispシステムでは非常に普遍的であるため、それらが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'a  3 ;出力:(1 2 a 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  list'a  '  b'c  ))setf bar cons ' x cdr foo )))
     

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

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

 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では準クォートと呼ばれます)もサポートしています。これはプレーンクォートとほぼ同じですが、式を評価し、それらの値をコンマunquoteおよびコンマatスプライス演算子を使用してクォートリストに補間できる点が異なります。変数に値がある場合、は評価され、はに評価されます。バッククォートは、マクロ展開を定義する際に最もよく使用されます。[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によってエラーとして定義されます(ファイルコンパイラは同様の定数を合体させ、書き込み保護されたメモリに配置できるため、コンパイルされたファイルで「未定義」の動作が発生します。等。)。

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

スコープとクロージャ

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

プログラムコードの構造を一覧表示します。マクロとコンパイラによる悪用

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

Lispはこれを使用して、非常に強力なマクロシステムを実装します。CプリプロセッサCObjective-C、および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では、引数は適用可能な順序(「左端の最も内側」)で評価されますが、 Schemeでは引数の順序は未定義であり、コンパイラーによる最適化の余地があります。

制御構造

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

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

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

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

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

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

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

良い例は、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 ))))

上記の例を、CommonLispのマクロを使用する反復バージョンと比較しくださいloop

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

  • Common Lisp Object SystemであるCLOSは、ANSICommonLispの不可欠な部分です。CLOSはNewFlavoursとCommonLOOPSの子孫です。ANSI Common Lispは、最初の標準化されたオブジェクト指向プログラミング言語(1994、ANSI X3J13)でした。
  • ObjectLisp [64]またはObjectLisp 、 LispMachinesIncorporatedおよびMacintoshCommonLispの初期バージョンで使用
  • LOOPS(Lispオブジェクト指向プログラミングシステム)とそれ以降のCommonLOOPS
  • MITで構築されたフレーバーとその子孫である新しいフレーバー(Symbolicsによって開発された)。
  • Common LispのGUIライブラリであるGarnetの作成を支援するために開発された、制約ベースのオブジェクトシステムであるKR(知識表現の略)
  • 知識工学環境(KEE)は、UNITSと呼ばれるオブジェクトシステムを使用し、それを推論エンジン[65]および真理維持システム(ATMS)と統合しました。

も参照してください

参照

  1. ^ 「はじめに」ジュリアマニュアルドキュメントを読んでください。2016年4月8日にオリジナルからアーカイブされまし2016年12月10日取得
  2. ^ 「Wolfram言語のQ&A」WolframResearch 2016年12月10日取得
  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 2020年8月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プログラミングの芸術シュプリンガーサイエンス&ビジネスメディア。p。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プログラマーズマニュアル(PDF)(第2版)。p。序文。 {{cite book}}:次の日付値を確認してください|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)からアーカイブされました。 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です2010年5月11日にアクセス。
  21. ^ マッカーシー、ジョン; アブラハム、ポールW .; エドワーズ、ダニエルJ .; ハート、ティモシーP .; Levin、Michael I.(1985)[1962]。LISP 1.5プログラマーズマニュアル(PDF)(第2版)。MITプレスISBN  0-262-13011-4
  22. ^ Quam、Lynn H .; ディフル、ホイットフィールド。スタンフォードLISP1.6マニュアル(PDF)
  23. ^ 「Maclispリファレンスマニュアル」1979年3月3日。2007年12月14日のオリジナルからアーカイブ。
  24. ^ Teitelman、ウォーレン(1974)。InterLispリファレンスマニュアル(PDF)2006年6月2日にオリジナル(PDF)からアーカイブされました2006年8月19日取得
  25. ^ Outils degeneration d'interfaces:etat de l'art et H.ElMrabetによる分類
  26. ^ ジェラルド・ジェイ・サスマン&ガイ・ルイス・スティール・ジュニア(1975年12月)。「スキーム:拡張ラムダ計算のインタプリタ」(PDF)AIメモMITAIラボAIM-349 2021年12月23日取得
  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月4日にオリジナルからアーカイブされまし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]「ArmedBearCommonLisp(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 =(...)を使用して表され、複数の参照を持つターゲットの短所セルを表します。#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. ^ Wayback Machine AlanBawdenで2013年6月3日にアーカイブされたLisp 準引用
  61. ^ 評価の時間-CommonLispExtensionsGnu.org。2013年7月17日に取得。
  62. ^ 3.2.2.3 CommonLispHyperSpec
  63. ^ 4.3。KentPitmanPeterNorvigによる「GoodLispプログラミングスタイルのチュートリアル」の制御抽象化(再帰と反復)、1993年8月。
  64. ^ Bobrow1986の17ページ
  65. ^ Veitch、p 108、1988

さらに読む

外部リンク

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