Common Lisp


Common_Lisp

Common Lisp(CL)は、Lispプログラミング言語の方言であり、ANSI標準文書ANSI INCITS 226-1994(S20018)(以前のX3.226-1994(R1999))で公開されています。 Common LispのHyperSpec、ハイパーリンクHTMLバージョンは、ANSI Common Lispの標準から導出されました。 Common Lisp パラダイム
マルチパラダイム:手続き型、機能型、オブジェクト指向、メタ、リフレクティブ、ジェネリック
家族
舌足らずの発音
によって設計された
スコット・ファールマン、リチャード・P・ガブリエル、デビッド・A・ムーン、ケント・ピットマン、ガイ・スティール、ダン・ウェインレブ
デベロッパー
ANSI X3J13委員会
初登場
1984 (38年前)、1994 (28年前) ANSI Common Lisp (1984) (1994)
規律の入力
ダイナミックで強い
範囲
字句、オプションで動的 OS クロスプラットフォーム
ファイル名拡張子
.lisp、.lsp、.l、.cl、.fasl
Webサイト
common-lisp .net
主な実装
Allegro CL、ABCL、CLISP、Clozure CL、CMUCL、ECL、GCL、LispWorks、Scieneer CL、SBCL、Symbolics Common Lisp
方言
CLtL1、CLtL2、ANSI Common Lisp
に影響を受けた
Lisp、Lisp Machine Lisp、Maclisp、Scheme、Interlisp
影響を受け
Clojure、Dylan、Emacs Lisp、EuLisp、ISLISP、* Lisp、AutoLisp、Julia、Moose、R、SKILL、SubL
Common Lisp言語は、Maclispの後継として標準化および改良されたものとして開発されました。:1980年代初期によっていくつかのグループはのMacLispに多様な後継者の仕事ですでにだったLispマシンLispの(Zetalispの別名)、スパイスのLisp、NILとS-1 Lispの。Common Lispは、これらのMacLisp方言の機能を統合、標準化、および拡張しようとしました。Common Lispは実装ではなく、言語仕様です。 Freeおよびオープンソースソフトウェアやプロプライエタリ製品など、CommonLisp標準のいくつかの実装が利用可能です。 Common Lispは、汎用のマルチパラダイムプログラミング言語です。手続き型、関数型、およびオブジェクト指向プログラミングパラダイムの組み合わせをサポートします。動的計画法言語として、効率的なランタイムプログラムへの反復コンパイルにより、進化的かつ段階的なソフトウェア開発を容易にします。この段階的な開発は、多くの場合、実行中のアプリケーションを中断することなくインタラクティブに実行されます。
また、オプションの型注釈とキャストもサポートしています。これらは、後のプロファイリングと最適化の段階で必要に応じて追加できるため、コンパイラーはより効率的なコードを生成できます。たとえば、ハードウェアと実装でサポートされている範囲でボックス化されていない整数をfixnum保持できるため、大きな整数や任意精度の型よりも効率的な演算が可能になります。同様に、コンパイラーは、optimize宣言を使用して、モジュールごとまたは関数ごとに、どのタイプの安全レベルが必要かを通知できます。
Common Lispには、マルチメソッドとメソッドの組み合わせをサポートするオブジェクトシステムであるCLOSが含まれています。多くの場合、メタオブジェクトプロトコルで実装されます。
Common Lispは、Lispマクロ(コード変換)やリーダーマクロ(文字の入力パーサー)などの標準機能を介して拡張できます。
Common Lispは、MaclispおよびJohnMcCarthyの元のLispとの部分的な下位互換性を提供します。これにより、古いLispソフトウェアをCommonLispに移植できます。

コンテンツ
1 歴史
2 構文
3 データ型
3.1 スカラー型 3.2 データ構造 3.3 機能
3.3.1 関数の定義
3.3.2 ジェネリック関数とメソッドの定義
3.3.3 関数の名前空間
3.3.4 複数の戻り値
3.43.4 他のタイプ
4 範囲
4.1 スコープの限定詞 4.2 環境の種類
4.2.1 グローバル
4.2.2 動的
4.2.3 語彙
5 マクロ
5.1 マクロを使用して新しい制御構造を定義する例 5.2 可変キャプチャとシャドウイング
6 コンディションシステム
7 Common Lisp Object System(CLOS)
8 コンパイラとインタプリタ
9 コード例
9.1 誕生日のパラドックス 9.2 人物オブジェクトのリストの並べ替え 9.3 二乗による指数化 9.4 利用可能なシェルのリストを見つける
10 他のLispとの比較
11 実装
11.1 実装のリスト
11.1.1 商用実装
11.1.2 自由に再配布可能な実装
11.1.3 その他の実装
12 アプリケーション
13 も参照してください
14 参考文献
15 参考文献
16 外部リンク

歴史
Common Lispの作業は、ARPAマネージャーのBob Engelmoreが単一のコミュニティ標準Lisp方言を開発するイニシアチブをとった後、1981年に開始されました。初期の言語設計の多くは、電子メールを介して行われました。 1982年、Guy L. Steele Jr.は、1982年のLISPと関数型プログラミングに関するACMシンポジウムで、CommonLispの最初の概要を説明しました。
最初の言語のドキュメントは、1984年にCommon Lisp the Language(CLtL1として知られる)の初版として公開されました。1990年に発行された第2版(CLtL2として知られる)は、ANSI Common Lisp標準化プロセス中に行われた言語への多くの変更を取り入れました:拡張LOOP構文、Common Lisp Object System、エラー処理のための条件システム、きれいなプリンターとはるかに。しかし、CLtL2は最終的なANSI Common Lisp標準を記述していないため、ANSI CommonLispのドキュメントではありません。その後、最終的なANSI Common Lisp標準が1994年に公開されました。それ以来、標準の更新は公開されCommon Lispのさまざまな拡張機能と改善点(例としては、Unicode、同時実行性、CLOSベースのIO)が、実装とライブラリーによって提供されています。

構文
CommonLispはLispの方言です。これは、使用S式をコードおよびデータ構造の両方を意味します。関数呼び出し、マクロフォーム、および特殊フォームは、次の例のように、最初に演算子の名前が付いたリストとして記述されます。(+ 2 2 )
; 2と2を加算すると、4になります。関数の名前は「+」です。Lispにはそのような演算子はありません。(defvar * x * )
; 変数* x *が存在することを確認し
ます; 値を与えずに。アスタリスクは ;の 一部です。名前。慣例により、特別な(グローバル)変数を示します。; シンボル* x *には、次のプロパティも付与されます
。その後のバインディングは、字句ではなく動的です。 (setf * x * 42.1 ) ; 変数* x *を浮動小数点値42.1に設定します
;; 数値を二乗する関数を定義します: (defun square (x ) (* x x ))
;; 関数を実行します: (square 3 )
; 9を返します
;; ‘let’構文は、ローカル変数のスコープを作成します。ここ ;; 変数 ‘a’は6にバインドされ、変数 ‘b’はバインドされます ;; 4.「let」の中には「body」があり、最後に計算された値が返されます。 ;; ここで、aとbを追加した結果は、「let」式から返されます。 ;; 変数aとbは、記号が ;; でない限り、字句スコープを持ちます。特別な変数としてマークされています(たとえば、以前のDEFVARによって)。(let ((a 6 )(b 4 )) (+ a b ))
; 10を返します

データ型
CommonLispには多くのデータ型が

スカラー型
数値タイプには、整数、比率、浮動小数点数、および複素数が含まれます。 Common Lispは、bignumを使用して、任意のサイズと精度の数値を表します。比率タイプは分数を正確に表します。これは、多くの言語では利用できない機能です。Common Lispは、必要に応じてこれらのタイプ間で数値を自動的に強制します。
CommonLispの文字タイプはASCII文字に限定されません。最新の実装のほとんどは、Unicode文字を許可しています。
シンボルタイプは、Lisp言語に共通ですが、ほとんど未知の外にそれら。シンボルは、名前、値、関数、プロパティリスト、パッケージなど、いくつかの部分からなる一意の名前付きデータオブジェクトです。これらの中で、バリューセルとファンクションセルが最も重要です。Lispのシンボルは、他の言語の識別子と同じように使用されることがよく変数の値を保持するため。ただし、他にも多くの用途が通常、シンボルが評価されると、その値が返されます。一部のシンボルはそれ自体に評価されます。たとえば、キーワードパッケージ内のすべてのシンボルは自己評価されます。Common Lispのブール値は、自己評価記号TおよびNILで表されます。Common Lispには、「パッケージ」と呼ばれるシンボルの名前空間が
スカラー数値をさまざまな方法で丸めるために、いくつかの関数を使用できます。この関数roundは、引数を最も近い整数に丸め、途中の場合は偶数の整数に丸めます。関数、、、およびtruncateはfloor、ceilingそれぞれゼロ、ダウン、またはアップに向かって丸めます。これらの関数はすべて、破棄された小数部分を2次値として返します。たとえば、(floor -2.5)-3、0.5が得られます。(ceiling -2.5)-2、-0.5を生成します。(round 2.5)収量2、0.5; そして(round 3.5)、4、-0.5をもたらします。

データ構造
Common Lispのシーケンスタイプには、リスト、ベクトル、ビットベクトル、および文字列が含まれます。任意のシーケンスタイプで機能する操作は多数
他のほとんどすべてのLisp方言と同様に、Common Lispのリストは、consセルまたはペアと呼ばれることもあるconsesで構成されています。短所は、その呼ばれる、二つのスロットを有するデータ構造で車とCDR。リストは、リンクされた一連のコンスまたは空のリストです。各短所の車は、リストのメンバー(おそらく別のリスト)を参照します。各短所のcdrは次の短所を参照します。ただし、リストの最後の短所は例外で、そのcdrは値を参照します。Consesは、ツリーやその他の複雑なデータ構造を実装するためにも簡単に使用できます。ただし、通常は代わりに構造体またはクラスインスタンスを使用することをお勧めします。consesを使用して循環データ構造を作成することもできます。nil
Common Lispは多次元配列をサポートしており、必要に応じて調整可能な配列のサイズを動的に変更できます。多次元配列は、行列数学に使用できます。ベクターは、一次元アレイです。配列は、任意の型をメンバーとして運ぶことができます(同じ配列内の混合型であっても)、またはビットのベクトルのように、特定の型のメンバーを含むように特殊化することができます。通常、サポートされているタイプはごくわずかです。使用される配列が型に特化している場合、多くの実装で配列関数を最適化できます。二つのタイプ特化配列型は標準的である:文字列は、文字のベクトルであり、一方、ビットベクトルがベクトルであるビット。
ハッシュテーブルは、データオブジェクト間の関連付けを格納します。任意のオブジェクトをキーまたは値として使用できます。ハッシュテーブルは、必要に応じて自動的にサイズ変更されます。
パッケージはシンボルのコレクションであり、主にプログラムの一部を名前空間に分離するために使用されます。パッケージはいくつかのシンボルをエクスポートし、それらをパブリックインターフェイスの一部としてマークする場合がパッケージは他のパッケージを使用できます。
構造体は、C構造体やPascalレコードと同様に使用され、任意の数とタイプのフィールド(スロットと呼ばれる)を持つ任意の複雑なデータ構造を表します。構造体は単一継承を可能にします。
クラスは構造に似ていますが、より動的な機能と多重継承を提供します。(CLOSを参照)。クラスはCommonLispに遅れて追加されており、構造との概念的な重複がいくつかクラスで作成されたオブジェクトは、インスタンスと呼ばれます。特別な場合はジェネリック関数です。ジェネリック関数は、関数とインスタンスの両方です。

機能
CommonLispはファーストクラスの関数をサポートしています。たとえば、他の関数を引数として取る関数や、関数を返す関数を作成することもできます。これにより、非常に一般的な操作を説明できます。
Common Lispライブラリは、このような高階関数に大きく依存しています。たとえば、このsort関数は、関係演算子を引数として取り、key関数をオプションのキーワード引数として取ります。これは、あらゆるタイプのデータをソートするだけでなく、キーに従ってデータ構造をソートするためにも使用できます。
;; 関係演算子として>および<関数を使用してリストをソートします。 (ソート (リスト 5 2 6 3 1 4 ) # ' > ) ; 戻り値(6 5 4 3 2 1) (sort (list 5 2 6 3 1 4 ) # ‘ < ) ; 戻り値(1 2 3 4 5 6)
;; 各サブリストの最初の要素に従ってリストを並べ替えます。 (sort (list ‘ (9 A ) ‘ (3 B ) ‘ (4 C )) #’ < :key # ' first ) ; 戻り値((3 B)(4 C)(9 A))
関数の評価モデルは非常に単純です。評価者がフォームに遭遇する(f a1 a2…)と、fという名前の記号は次のいずれかであると見なされます。
特別な演算子(固定リストに対して簡単にチェックできます)
マクロ演算子(事前に定義されている必要があります)
関数の名前(デフォルト)。シンボル、またはシンボルで始まるサブフォームのいずれかlambdaです。
fが関数の名前である場合、引数a1、a2、…、anは左から右の順序で評価され、関数が検出され、パラメーターとして指定された値を使用して呼び出されます。

関数の定義
マクロはdefun関数定義は、関数、引数の名前、および関数本体の名前を与える関数を定義しています。(defun square (x ) (* x x ))
関数定義には、宣言と呼ばれるコンパイラ指令が含まれる場合がこれは、最適化設定または引数のデータ型に関するヒントをコンパイラに提供します。また、Lispシステムがインタラクティブなドキュメントを提供するために使用できるドキュメント文字列(docstrings)が含まれる場合も(関数定義 正方形 (X ) “を算出単フロートXの二乗。” (DECLARE (シングルフロート X ) (最適化 (速度 3 ) (デバッグ 0 ) (安全性 1 ))) (単フロート(* X x )))
匿名関数(関数リテラル)はlambda、式を使用して定義され(lambda (x) (* x x))ます。たとえば、引数を2乗する関数の場合です。Lispプログラミングスタイルは、無名関数を引数として提供すると便利な高階関数を頻繁に使用します。
地元の機能は使用して定義することができますfletとlabels。(flet ((square (x )(* x x ))) (square 3 ))
関数の定義と操作に関連する他のいくつかの演算子がたとえば、関数はcompile演算子を使用してコンパイルできます。(一部のLispシステムは、コンパイルするように指示されない限り、デフォルトでインタプリタを使用して関数を実行します。他のシステムはすべての関数をコンパイルします)。

ジェネリック関数とメソッドの定義
マクロdefgenericはジェネリック関数を定義します。ジェネリック関数はメソッドのコレクションです。マクロdefmethodはメソッドを定義します。
メソッドは、CLOS標準クラス、システムクラス、構造体クラス、または個々のオブジェクトにパラメータを特化できます。多くのタイプには、対応するシステムクラスが
ジェネリック関数が呼び出されると、多重ディスパッチが使用する効果的な方法を決定します。(defgeneric add (a b ))(defmethod add ((a number ) (b number )) (+ a b ))(defmethod 追加 ((ベクトル)(B番号)) (地図「ベクター(ラムダ(N )(+ N B ))))(defmethod 追加 ((ベクトル)(Bのベクトル)) (地図’ベクトル#’ + B ))(defmethod 追加 ((文字列)(Bの文字列)) (CONCATENATE 「列B ))(2 3を追加 ); 5を返します(#(1 2 3 4 )7を追加); 戻り値#(8 9 10 11)(add #(1 2 3 4 )#(4 3 2 1 )); 戻り位(5 5) (追加”共通” “LISPを” )。「COMMONLISP」を返します
ジェネリック関数もファーストクラスのデータ型です。ジェネリック関数とメソッドには、上記よりも多くの機能が

関数の名前空間
関数名の名前空間は、データ変数の名前空間とは別のものです。これは、CommonLispとSchemeの主な違いです。Common Lispのために、関数の名前空間に名を定義演算子は含まれdefun、flet、labels、defmethodとdefgeneric。
関数を引数として別の関数に名前で渡すには、function特殊な演算子(通常は#’。と略記)を使用する必要が上記の最初のsort例>は、関数名前空間のシンボルによって名前が付けられた関数をコードで参照しています#’>。逆に、このように渡された関数を呼び出すfuncallには、引数に演算子を使用します。
Schemeの評価モデルはより単純です。名前空間は1つだけであり、フォーム内のすべての位置が(任意の順序で)評価されます。引数だけではありません。したがって、一方の方言で記述されたコードは、もう一方の方言の経験が豊富なプログラマーにとっては混乱を招くことがたとえば、多くのCommon Lispプログラマーは、関数名をローカルでシャドウイングするため、Schemeで問題を引き起こす可能性のあるリストや文字列などの記述変数名を使用することを好みます。
関数用の個別の名前空間が利点であるかどうかは、Lispコミュニティでの論争の原因です。これは通常、Lisp-1対Lisp-2の討論と呼ばれます。Lisp-1はSchemeのモデルを指し、Lisp-2はCommonLispのモデルを指します。これらの名前は、リチャードP.ガブリエルとケントピットマンによる1988年の論文で造られました。この論文では、2つのアプローチを広範囲に比較しています。

複数の戻り値
Common Lispはの概念をサポートして複数の値を、いずれかの式は常に単一の持っている主要な価値を、それはまた、任意の数の可能性があります二値興味発信者が受信して検査することが二次値は完全にオプションであり、専用のサイドチャネルを介して渡されるため、この概念はリスト値を返すこととは異なります。これは、発信者が二次値を必要としない場合、そこにあることに完全に気付かない可能性があることを意味し、情報を伝達するためのメカニズムを使用すると便利です。例えば、
TRUNCATE関数に与えられた番号を丸め整数ゼロに向かいます。ただし、余りを2次値として返すため、切り捨てられた値を簡単に判別できます。また、オプションの除数パラメーターをサポートします。これを使用して、除法の原理を簡単に実行できます。(let ((x 1266778 )(y 458 )) (複数値バインド (商の 剰余)(切り捨て x y ) (format nil “〜Aを〜Aで割ったものは〜Aの剰余〜A” x yの 商の 剰余)) )。;;;; =>「1266778を458で割ると2765の余り408になります」
GETHASHは、連想マップのキーの値、またはそれ以外の場合はデフォルト値、および値が見つかったかどうかを示す2次ブール値を返します。したがって、値が見つかったかデフォルトとして提供されたかを気にしないコードは、そのまま使用できますが、そのような区別が重要な場合は、2次ブール値を検査して適切に反応する可能性がどちらのユースケースも同じ呼び出しでサポートされており、どちらも他方によって不必要に負担や制約を受けることはありません。この機能を言語レベルで使用すると、他の言語で行われるように、キーの存在を確認したり、キーをnullと比較したりする必要がなくなります。(関数定義 のget-答 (ライブラリ) (GETHASH 「解答 ライブラリー 42 ))(defun the-answer-1 (library ) (format nil “The answer is〜A ” (get-answer library )));;;; 答えがライブラリに存在しない場合、「答えは42です」を返します(defun the-answer-2 (library ) (multiple-value-bind (answer sure-p )(get-answer library ) (if (not sure-p )
“I do n’t know”(format nil “The answer is 〜A ” 回答))));;;; ANSWERがLIBRARYに存在しない場合は、「わからない」を返します
複数の値は、いくつかの標準形式でサポートされています。その最も一般的MULTIPLE-VALUE-BINDな形式は、2次値にアクセスしVALUES、複数の値を返すための特別な形式です。(defun magic-eight-ball () “確率を2次値として、見通しの予測を返します” (値 “Outlook good” (ランダム 1.0 )));;;; =>「見通しは良い」;;;; => 0.3187

他のタイプ
CommonLispの他のデータ型は次のとおりです。
パス名は、ファイルシステム内のファイルとディレクトリを表します。Common Lispパス名機能は、ほとんどのオペレーティングシステムのファイル命名規則よりも一般的であり、Lispプログラムがさまざまなシステム間でファイルに広く移植できるようにします。
入力ストリームと出力ストリームは、ターミナルファイルや開いているファイルなどのバイナリデータまたはテキストデータのソースとシンクを表します。
Common Lispには、疑似乱数ジェネレーター(PRNG)が組み込まれています。ランダム状態オブジェクトは、疑似乱数の再利用可能なソースを表し、ユーザーがPRNGをシードしたり、シーケンスを再生したりできるようにします。
条件は、プログラムが応答する可能性のあるエラー、例外、およびその他の「興味深い」イベントを表すために使用されるタイプです。
クラスはファーストクラスのオブジェクトであり、それ自体がメタオブジェクトクラス(略してメタクラス)と呼ばれるクラスのインスタンスです。
読み取りテーブルは、CommonLispのリーダーがソースコードのテキストを解析する方法を制御するオブジェクトの一種です。コードを読み込むときに使用する読み取りテーブルを制御することにより、プログラマーは言語の構文を変更または拡張できます。

範囲
他の多くのプログラミング言語のプログラムと同様に、Common Lispプログラムは、変数、関数、および他の多くの種類のエンティティを参照するために名前を使用します。名前付き参照はスコープの対象となります。
名前とその名前が参照するエンティティとの関連付けは、バインディングと呼ばれます。
スコープとは、名前に特定のバインディングがあると判断される一連の状況を指します。

スコープの限定詞
CommonLispのスコープを決定する状況は次のとおりです。
式内の参照の場所。化合物の左端の位置の場合は、特殊な演算子、マクロまたは関数のバインディングを指します。それ以外の場合は、変数のバインディングなどを指します。
参照が行われる表現の種類。例えば、(go x)ラベルに転送制御手段xに対し、(print x)変数を指しますx。xタグボディラベルは変数名とは別の名前空間にあるため、の両方のスコープをプログラムテキストの同じ領域でアクティブにすることができます。特殊形式またはマクロ形式は、構文内のすべての記号の意味を完全に制御できます。たとえば(defclass x (a b) ())、クラス定義で(a b)は、は基本クラスのリストであるため、これらの名前はクラス名のスペースで検索され、x既存のバインディングへの参照ではなく、派生する新しいクラスの名前です。。これらの事実は、純粋にのセマンティクスから明らかになります。この式に関する唯一の一般的な事実は、マクロバインディングを参照していることです。他のすべてはまでです。abdefclassdefclassdefclass
プログラムテキスト内の参照の場所。たとえば、変数への参照xが、のバインディングletを定義するaなどのバインディング構造で囲まれているx場合、その参照はそのバインディングによって作成されたスコープ内に
変数参照の場合、変数シンボルがローカルまたはグローバルに特別に宣言されているかどうか。これにより、参照が字句環境内で解決されるか、動的環境内で解決されるかが決まります。
参照が解決される環境の特定のインスタンス。環境は、シンボルをバインディングにマップするランタイムディクショナリです。各種類の参照は、独自の種類の環境を使用します。字句変数への参照は、字句環境などで解決されます。複数の環境を同じ参照に関連付けることができます。たとえば、再帰または複数のスレッドの使用のおかげで、同じ機能の複数のアクティブ化が同時に存在する可能性がこれらのアクティベーションは同じプログラムテキストを共有しますが、それぞれに独自の字句環境インスタンスが
シンボルが何を指しているのかを理解するには、Common Lispプログラマーは、表現されている参照の種類、変数参照の場合に使用するスコープの種類(動的スコープと字句スコープ)、および実行時の状況を知る必要が参照が解決された環境、環境に導入されたバインディングなどはどこにありますか。

環境の種類
グローバル

Lispのいくつかの環境は世界的に普及しています。たとえば、新しいタイプが定義された場合、それ以降はどこでも認識されます。そのタイプへの参照は、このグローバル環境で検索します。

動的
Common Lispの環境の1つのタイプは、動的環境です。この環境で確立されたバインディングには動的な範囲がつまり、バインディングはletブロックなどの一部のコンストラクトの実行の開始時に確立され、そのコンストラクトの実行が終了すると消えます。その存続期間は、ブロック。ただし、動的バインディングはそのブロック内に表示されるだけではありません。また、そのブロックから呼び出されたすべての関数にも表示されます。このタイプの可視性は、無期限スコープとして知られています。動的な範囲(ブロックのアクティブ化と非アクティブ化に関連付けられた存続期間)と不定のスコープ(そのブロックから呼び出されるすべての関数に表示される)を示すバインディングは、動的なスコープを持つと言われます。
Common Lispは、動的スコープ変数をサポートしています。これは、特殊変数とも呼ばれます。リスタートやキャッチタグなど、他の特定の種類のバインディングも必然的に動的にスコープされます。関数バインディングは、flet(字句スコープの関数バインディングのみを提供する)を使用して動的にスコープすることはできませんが、関数オブジェクト(Common Lispの第1レベルのオブジェクト)を動的スコープの変数に割り当て、動的スコープで使用letしてバインドし、funcallまたはを使用して呼び出すことができAPPLYます。
動的スコープは、グローバル変数に参照の明確さと規律を追加するため、非常に便利です。グローバル変数は、コンピュータサイエンスでは、潜在的なエラーの原因として嫌われています。これは、モジュール間でアドホックな秘密の通信チャネルが発生し、望ましくない驚くべき相互作用が発生する可能性があるためです。
Common Lispでは、トップレベルのバインディングのみを持つ特別な変数は、他のプログラミング言語のグローバル変数と同じように動作します。新しい値を格納することができ、その値は単に最上位のバインディングにあるものを置き換えます。グローバル変数の値を不注意に置き換えることは、グローバル変数の使用によって引き起こされるバグの中心です。ただし、特別な変数を操作する別の方法は、式内で新しいローカルバインディングを変数に与えることです。これは、変数の「再バインド」と呼ばれることも動的スコープの変数をバインドすると、その変数の新しいメモリ位置が一時的に作成され、名前がその位置に関連付けられます。そのバインディングが有効である間、その変数へのすべての参照は新しいバインディングを参照します。以前のバインディングは非表示になっています。バインディング式の実行が終了すると、一時メモリの場所がなくなり、元の値がそのままの状態で古いバインディングが明らかになります。もちろん、同じ変数の複数の動的バインディングをネストすることもできます。
マルチスレッドをサポートするCommonLisp実装では、動的スコープは実行の各スレッドに固有です。したがって、特別な変数はスレッドローカルストレージの抽象化として機能します。1つのスレッドが特別な変数を再バインドする場合、この再バインドは他のスレッドのその変数に影響を与えません。バインディングに格納されている値は、そのバインディングを作成したスレッドによってのみ取得できます。各スレッドがいくつかの特別な変数をバインドした場合は*x*、その後、*x*スレッドローカルストレージのように振る舞います。再バインドしないスレッドの中で*x*、それは通常のグローバルのように動作します。これらのスレッドはすべて、の同じトップレベルのバインディングを参照し*x*ます。
動的変数を使用すると、追加のコンテキスト情報を使用して実行コンテキストを拡張できます。このコンテキスト情報は、追加の関数パラメーターとして表示されることなく、関数から関数に暗黙的に渡されます。これは、制御転送が無関係のコードのレイヤーを通過する必要がある場合に特に役立ちます。このコードは、追加のデータを渡すために追加のパラメーターで拡張することはできません。このような状況では、通常、グローバル変数が必要になります。スキームが再帰的に壊れないように、そのグローバル変数を保存して復元する必要が動的変数の再バインドがこれを処理します。そして、その変数はスレッドローカルにする必要があります(または、大きなミューテックスを使用する必要があります)。これにより、スキームがスレッドの下で壊れることがなくなります。動的スコープの実装でもこれを処理できます。
Common Lispライブラリには、多くの標準的な特殊変数がたとえば、すべての標準I / Oストリームは、よく知られている特殊変数の最上位バインディングに格納されます。標準出力ストリームは* standard-output *に保存されます。
関数fooが標準出力に書き込むとします。(defun foo () (format t “Hello、world” ))
その出力を文字列に取り込むために、* standard-output *を文字列ストリームにバインドして、次のように呼び出すことができます。(with-output-to-string (* standard-output * ) (foo ))-> “Hello、world”; 収集された出力は文字列として返されます

語彙
CommonLispは字句環境をサポートします。正式には、字句環境のバインディングには字句スコープがあり、名前空間のタイプに応じて、不定の範囲または動的な範囲のいずれかを持つ場合が字句スコープとは、バインディングが確立されているブロックに可視性が物理的に制限されることを意味します。そのブロックにテキストで(つまり字句的に)埋め込まれていない参照は、単にそのバインディングを認識しません。
TAGBODYのタグには、字句スコープが式(GO X)は、ラベルXを含むTAGBODYに埋め込まれていない場合は誤りです。ただし、ラベルバインディングは動的な範囲を持っているため、実行を終了するとラベルバインディングが消えます。字句クロージャの呼び出しによってそのコードのブロックが再入力された場合、そのクロージャの本体がGOを介してタグに制御を移そうとすることは無効です。(defvar * stashed * ) ;; 機能を保持します (tagbody (setf * stashed * (lambda () (go some-label ))) (go end-label ) ;;スキップ(print “Hello”) some-label (print “Hello” ) end-label ) -> NIL
TAGBODYが実行されると、最初に、関数を特殊変数* stashed *に格納するsetfフォームが評価されます。次に、(go end-label)は、コードをスキップして、制御をend-labelに移します(「Hello」を出力)。end-labelはタグ本体の最後にあるため、タグ本体は終了し、NILを生成します。以前に記憶されていた関数が現在呼び出されているとします。(funcall * stashed * ) ;; エラー!
この状況は誤りです。実装の応答の1つは、「GO:タグSOME-LABELのタグボディがすでに残っています」というメッセージを含むエラー条件です。この関数は、タグ本体に字句的に埋め込まれている(go some-label)を評価しようとし、ラベルに解決されます。ただし、タグボディが実行されていない(エクステントが終了している)ため、制御の転送を実行できません。
Lispのローカル関数バインディングには字句スコープがあり、変数バインディングにもデフォルトで字句スコープがGOラベルとは対照的に、これらは両方とも無限の範囲を持っています。字句関数または変数バインディングが確立されると、そのバインディングを確立した構成が終了した後でも、そのバインディングは、それへの参照が可能な限り存在し続けます。字句クロージャのおかげで、確立構造の終了後の字句変数および関数への参照が可能です。
字句バインディングは、CommonLisp変数のデフォルトのバインディングモードです。個々のシンボルについては、ローカル宣言またはグローバル宣言のいずれかによって動的スコープに切り替えることができます。後者は、DEFVARやDEFPARAMETERなどの構造を使用することで暗黙的に発生する可能性がCommon Lispプログラミングの重要な規則は、特別な(つまり動的にスコープされた)変数の名前が、いわゆる「イヤーマフ規則」のアスタリスク記号 *で始まり、終わる名前を持つことです。準拠している場合、この規則は、特殊変数用に別個の名前空間を効果的に作成するため、字句を意図した変数が誤って特殊化されることはありません。
字句スコープはいくつかの理由で役立ちます。
まず、ランタイム環境の構造が比較的単純であるため、変数と関数への参照を効率的なマシンコードにコンパイルできます。多くの場合、ストレージをスタックするように最適化できるため、字句スコープの開閉によるオーバーヘッドは最小限に抑えられます。完全なクロージャーを生成する必要がある場合でも、クロージャーの環境へのアクセスは依然として効率的です。通常、各変数はバインディングのベクトルへのオフセットになるため、変数参照は、ベースプラスオフセットアドレッシングモードを使用した単純なロードまたはストア命令になります。
第二に、字句スコープ(無限の範囲と組み合わせて)は字句クロージャを生じさせます。これにより、関数型プログラミングのルートであるファーストクラスオブジェクトである関数の使用を中心としたプログラミングのパラダイム全体が作成されます。
第三に、おそらく最も重要なことは、字句クロージャが利用されていない場合でも、字句スコープを使用すると、プログラムモジュールが不要な相互作用から分離されます。可視性が制限されているため、字句変数はプライベートです。あるモジュールAが字句変数Xをバインドし、別のモジュールBを呼び出す場合、B内のXへの参照が誤ってA内にバインドされたXに解決されることはありません。Bは単にXにアクセスできません。望ましいのは、CommonLispが特別な変数を提供することです。特別な変数を使用すると、モジュールAは、Aから呼び出された別のモジュールBに表示される変数Xのバインディングを設定できます。これを実行できることは利点であり、発生を防ぐことができることも利点です。その結果、CommonLispは字句スコープと動的スコープの両方をサポートします。

マクロ
Lispのマクロは、表面的には使用法の関数に似ています。ただし、評価される式を表すのではなく、プログラムのソースコードの変換を表します。マクロは、周囲のソースを引数として取得し、それらをパラメーターにバインドして、新しいソースフォームを計算します。この新しいフォームでは、マクロも使用できます。新しいソースフォームがマクロを使用しなくなるまで、マクロ展開が繰り返されます。最終的に計算される形式は、実行時に実行されるソースコードです。
Lispでのマクロの典型的な使用法:
新しい制御構造(例:ループ構造、分岐構造)
スコーピングおよびバインディングコンストラクト
複雑で繰り返されるソースコードの簡略化された構文
コンパイル時の副作用を伴うトップレベルの定義フォーム
データ駆動型プログラミング
組み込みドメイン固有言語(例:SQL、HTML、Prolog)
暗黙のファイナライズフォーム
次のようなさまざまな標準のCommonLisp機能もマクロとして実装する必要が
setf割り当て/アクセス演算子のカスタムコンパイル時拡張を可能にする標準の抽象化
with-accessors、with-slots、with-open-fileおよび他の類似WITHのマクロ
実装に応じて、ifまたはcond他の特別な演算子に基づいて構築されたマクロです。マクロwhenでunless構成されています
強力なloopドメイン固有言語
マクロはdefmacroマクロによって定義されます。特別な演算子マクロレットを使用すると、ローカル(字句スコープ)マクロを定義できます。define-symbol-macroおよびsymbol-macroletを使用して、シンボルのマクロを定義することもできます。
ポール・グレアムの本のLispでは詳細にはCommon Lispのマクロの使用を記載しています。DougHoyteの著書LetOver Lambdaは、マクロに関する議論を拡張し、「マクロは、プログラミング言語としてのlispの最大の利点であり、プログラミング言語の最大の利点である」と述べています。Hoyteは、マクロの反復型開発のいくつかの例を提供しています。

マクロを使用して新しい制御構造を定義する例
マクロを使用すると、Lispプログラマーはその言語で新しい構文形式を作成できます。典型的な使用法の1つは、新しい制御構造を作成することです。サンプルマクロは、untilループ構造を提供します。構文は次のとおりです。(テストフォームまで*)
untilのマクロ定義:(defmacro until (test &body body ) (let ((start-tag (gensym “START” ))(end-tag (gensym “END” ))) ` (tagbody 、start-tag(when 、test (go 、end- tag )) (progn 、@ body ) (go 、start-tag ) 、end-tag )))
tagbodyは、タグに名前を付け、goフォームを使用してそれらのタグにジャンプする機能を提供する基本的なCommonLisp特殊演算子です。バッククォート`は、コンマが前に付いたフォームの値が入力されるコードテンプレートを提供する表記を提供します。コンマとアットマークが前に付いたフォームはスプライスされます。タグボディフォームは終了条件をテストします。条件が真の場合、終了タグにジャンプします。それ以外の場合は、提供された本文コードが実行されてから、開始タグにジャンプします。
上記のuntilマクロの使用例:(until (= (random 10 ) 0 ) (write-line “Hello” ))
コードは、関数macroexpand-1を使用して展開できます。上記の例の展開は次のようになります。(TAGBODY #:START1136 (WHEN (ZEROP (RANDOM 10 )) (GO #:END1137 )) (PROGN (WRITE-LINE “hello” )) (GO #:START1136 ) #:END1137 )
マクロ展開中、変数testの値は(=(random 10)0)であり、変数本体の値は((write-line “Hello”))です。本文はフォームのリストです。
記号は通常、自動的に大文字になります。拡張では、2つのラベルを持つTAGBODYを使用します。これらのラベルのシンボルはGENSYMによって計算され、どのパッケージにも組み込まれ2つのgoフォームは、これらのタグを使用してジャンプします。以来tagbodyは、 Common Lispの(とないマクロ)で原始的な演算子である、それは何か他のものに展開されることはありません。展開されたフォームは、whenマクロを使用します。これも展開されます。ソースフォームを完全に拡張することをコードウォーキングと呼びます。
完全に拡張された(ウォークされた)フォームでは、whenフォームがプリミティブに置き換えられます。(TAGBODY #:START1136 (IF (ZEROP (RANDOM 10 )) (PROGN (GO #:END1137 )) NIL ) (PROGN (WRITE-LINE “hello” )) (GO #:START1136 )) #:END1137 )
マクロを含むソースコードを正常に評価またはコンパイルする前に、すべてのマクロを展開する必要がマクロは、S式を受け入れて返す関数と見なすことができます。抽象構文木に似ていますが、これらに限定されません。これらの関数は、最終的なソースコードを生成するために、エバリュエーターまたはコンパイラーの前に呼び出されます。マクロは通常のCommonLispで記述されており、利用可能な任意のCommon Lisp(またはサードパーティ)演算子を使用できます。

可変キャプチャとシャドウイング
Common Lispマクロは、一般に変数キャプチャと呼ばれる機能を備えており、マクロ拡張本体のシンボルが呼び出し元のコンテキストのシンボルと一致するため、プログラマーはさまざまなシンボルが特別な意味を持つマクロを作成できます。変数キャプチャという用語は、演算子と関数の名前空間、タグボディラベルの名前空間、キャッチタグ、条件ハンドラー、再起動の名前空間など、すべての名前空間が不要なキャプチャに対して脆弱であるため、多少誤解を招く可能性が
変数キャプチャは、ソフトウェアの欠陥を引き起こす可能性がこれは、次の2つの方法のいずれかで発生します。
最初の方法では、マクロ展開は、マクロ作成者がグローバル名前空間で解決すると想定したシンボリック参照を誤って作成する可能性がありますが、マクロが展開されるコードは、その参照を盗むローカルのシャドウ定義を提供します。これをタイプ1キャプチャと呼びます。
2番目の方法であるタイプ2キャプチャは、正反対です。マクロの引数の一部は、マクロ呼び出し元によって提供されるコードの一部であり、それらのコードは、周囲のバインディングを参照するように記述されています。ただし、マクロはこれらのコードを拡張に挿入し、これらの参照の一部を誤ってキャプチャする独自のバインディングを定義します。
LispのScheme方言は、両方のタイプのキャプチャ問題を排除する参照透過性を提供するマクロ書き込みシステムを提供します。このタイプのマクロシステムは、特にその支持者(この問題を自動的に解決しないマクロシステムを非衛生的と見なす)によって「衛生的」と呼ばれることが
Common Lispでは、マクロ衛生は2つの異なる方法のいずれかで保証されます。
1つのアプローチは、gensymsを使用することです。これは、キャプチャの脅威なしにマクロ拡張で使用できる、保証された一意のシンボルです。マクロ定義でのgensymの使用は手動の雑用ですが、gensymのインスタンス化と使用を簡素化するマクロを作成できます。Gensymsはタイプ2キャプチャを簡単に解決しますが、マクロ展開では参照をキャプチャする周囲のコードの干渉シンボルの名前を変更できないため、同じ方法でタイプ1キャプチャに適用することはできません。Gensymsを使用して、マクロ拡張に必要なグローバルシンボルの安定したエイリアスを提供できます。マクロ展開では、既知の名前ではなくこれらの秘密のエイリアスが使用されるため、既知の名前を再定義してもマクロに悪影響はありません。
別のアプローチは、パッケージを使用することです。独自のパッケージで定義されたマクロは、展開時にそのパッケージの内部シンボルを使用するだけです。パッケージの使用は、タイプ1およびタイプ2のキャプチャを扱います。
ただし、パッケージは、標準のCommonLisp関数および演算子への参照のタイプ1キャプチャを解決しません。その理由は、キャプチャの問題を解決するためのパッケージの使用は、プライベートシンボル(1つのパッケージ内のシンボルであり、他のパッケージにインポートされていないか、他のパッケージで表示されていない)の使用を中心に展開しているためです。Common Lispライブラリシンボルは外部にあり、ユーザー定義パッケージに頻繁にインポートされたり、表示されたりします。
以下は、マクロの展開で発生する、演算子の名前空間での不要なキャプチャの例です。
;; UNTILの拡張では、DOを自由に使用します (defmacro until (expression &body body ) ` (do () (、expression ) 、@ body )) ;; macroletは、DOの字句演算子バインディングを確立します (macrolet ((do (… ) … something other … )) (until (= (random 10 ) 0 ) (write-line “Hello” )))
untilマクロは、呼び出しの形に展開されますdo、標準のCommon Lispのマクロを指すことを意図していますdo。ただし、このコンテキストでdoは、まったく異なる意味を持つ可能性があるため、until正しく機能しない可能性が
Common Lispは、標準の演算子と関数の再定義を禁止することにより、それらのシャドウイングの問題を解決します。これは標準演算子を再定義するためdo、上記は実際には不適合のCommon Lispのフラグメントであり、実装がそれを診断して拒否できるようにします。

コンディションシステム
コンディションシステムは責任がある例外処理のCommon Lispインチ 条件、ハンドラー、および再起動を提供します。条件は、例外的な状況(エラーなど)を説明するオブジェクトです。場合は条件がために、Common Lispのシステム検索を知らされるハンドラこの条件タイプのハンドラを呼び出します。ハンドラは、今、このような条件タイプと条件オブジェクトの一部として提供された関連情報などの情報を利用して、再起動し、自動的に現在の問題を修復するために、これらの再起動の使用1を検索し、適切な再起動機能を呼び出すことができます。
これらの再起動は、コードで処理されない場合、ユーザーに表示でき(たとえば、デバッガーのユーザーインターフェイスの一部として)、ユーザーは使用可能な再起動の1つを選択して呼び出すことができます。条件ハンドラーは(スタックを巻き戻さずに)エラーのコンテキストで呼び出されるため、他の例外処理システムが現在のルーチンを既に終了している場合、多くの場合、完全なエラー回復が可能です。デバッガー自体も、*debugger-hook*動的変数を使用してカスタマイズまたは置換できます。ファイナライザーなどのunwind-protectフォーム内にあるコードも、例外にもかかわらず、必要に応じて実行されます。
次の例(Symbolics Generaを使用)では、ファイルが存在しない場合、ユーザーはRead-Eval-Print-LOOP(REPL)から呼び出されたLisp関数テストでファイルを開こうとします。Lispシステムは4回の再起動を示します。ユーザーは、別のパス名の再起動を使用してOPENの再試行を選択し、別のパス名(lispm-int.lispの代わりにlispm-init.lisp)を入力します。ユーザーコードには、エラー処理コードは含まれエラー処理と再起動のコード全体はLispシステムによって提供され、ユーザーコードを終了することなくエラーを処理および修復できます。
コマンド:(テスト “> zippy> lispm-int.lisp”)エラー:ファイルが見つかりませんでした。
lispmの場合:> zippy> lispm-int.lisp.newestLMFS:OPEN-LOCAL-LMFS-1 引数0:#P “lispm:> zippy> lispm-int.lisp.newest”sA、:lispmのOPENを再試行します:> zippy> lispm-int.lisp.newestsB:別のパス名を使用してOPENを再試行してくださいsC、<中止>:TELNETサーバーのLispトップレベルに戻るsD:プロセスTELNET端末を再起動します->別のパス名を使用してOPENを再試行してください代わりにどのパス名を使用してください[デフォルトのlispm:> zippy> lispm-int.lisp.newest]: lispm:> zippy> lispm-init.lisp.newest…プログラムは継続します

Common Lisp Object System(CLOS)
Common Lisp Object System
Common Lispには、オブジェクト指向プログラミング用のツールキットであるCommon Lisp Object SystemまたはCLOSが含まれています。これは、あらゆる言語で利用できる最も強力なオブジェクトシステムの1つです。たとえば、Peter Norvigは、CLOSの機能(多重継承、ミックスイン、マルチメソッド、メタクラス、メソッドの組み合わせなど)を使用して、動的言語で実装するのが簡単なデザインパターンの数について説明しています。オブジェクト指向プログラミングのためのCommonLispのいくつかの拡張が、ANSI Common Lisp標準に含まれるますが、最終的にCLOSがCommonLispの標準オブジェクトシステムとして採用されました。CLOSは、多重ディスパッチと多重継承を備えた動的オブジェクトシステムであり、C ++やJavaなどの静的言語に見られるOOP機能とは根本的に異なります。動的オブジェクトシステムとして、CLOSは実行時にジェネリック関数とクラスへの変更を許可します。メソッドを追加および削除したり、クラスを追加および再定義したり、オブジェクトを更新してクラスを変更したり、オブジェクトのクラスを変更したりできます。
CLOSはANSICommonLispに統合されました。ジェネリック関数は通常の関数と同じように使用でき、ファーストクラスのデータ型です。すべてのCLOSクラスは、CommonLisp型システムに統合されています。多くのCommonLispタイプには、対応するクラスがCommonLispにはCLOSの使用の可能性が仕様には、条件がCLOSで実装されているかどうかは記載されパス名とストリームはCLOSで実装できます。ANSI Common Lisp用のCLOSのこれらのさらなる使用の可能性は、標準の一部ではありません。実際のCommonLisp実装は、パス名、ストリーム、入出力、条件、CLOS自体の実装などにCLOSを使用します。

コンパイラとインタプリタ
Lispインタプリタは、S式から読み取られたLispオブジェクト(リスト、シンボル、数値など)として提供されるLispソースコードを直接実行します。Lispコンパイラは、Lispソースコードからバイトコードまたはマシンコードを生成します。Common Lispを使用すると、個々のLisp関数をメモリにコンパイルすることも、ファイル全体を外部に保存されたコンパイル済みコード(faslファイル)にコンパイルすることもできます。
以前のLisp方言のいくつかの実装は、インタプリタとコンパイラの両方を提供していました。残念ながら、多くの場合、セマンティクスは異なっていました。これらの初期のLispは、コンパイラーで字句スコープを実装し、インタープリターで動的スコープを実装しました。Common Lispでは、インタプリタとコンパイラの両方がデフォルトで字句スコープを使用する必要がCommon Lisp標準は、インタプリタとコンパイラの両方のセマンティクスを記述しています。コンパイラは、関数使用して呼び出すことができ、コンパイルを個々の機能のために、関数使用してコンパイルファイルのファイルのために。Common Lispは型宣言を可能にし、コンパイラコード生成ポリシーに影響を与える方法を提供します。後者の場合、速度、スペース、安全性、デバッグ、コンパイル速度など、さまざまな最適化品質に0(重要ではない)から3(最も重要)までの値を指定できます。
Lispコードを評価する関数もあります:eval。evalコードを事前に解析されたS式として受け取り、他の言語のようにテキスト文字列としては受け取りません。このようにして、リストとシンボルを構築するための通常のLisp関数を使用してコードを構築し、このコードを関数で評価することができますeval。いくつかのCommonLisp実装(Clozure CLやSBCLなど)はeval、コンパイラーを使用して実装しています。このようにして、関数を使用して評価されたとしても、コードはコンパイルされますeval。
ファイルコンパイラは、関数compile-fileを使用して呼び出されます。コンパイルされたコードで生成されたファイルは、fasl(高速ロードから)ファイルと呼ばれます。これらのfaslファイルとソースコードファイルは、関数loadを使用して実行中のCommonLispシステムにロードできます。実装に応じて、ファイルコンパイラはバイトコード(たとえば、Java仮想マシン用)、C言語コード(Cコンパイラでコンパイルされる)、または直接ネイティブコードを生成します。
コードが完全にコンパイルされていても、CommonLispの実装はインタラクティブに使用できます。したがって、インタプリタ言語の考え方は、インタラクティブなCommonLispには適用されません。
この言語は、読み取り時、コンパイル時、ロード時、および実行時を区別し、ユーザーコードがこの区別を行って、必要なステップで必要なタイプの処理を実行できるようにします。
インタラクティブな開発に特に適した特別な演算子がいくつか用意されています。たとえば、defvar提供された変数がまだバインドされていない場合にのみ値を割り当てますが、defparameter常に割り当てを実行します。この区別は、ライブ画像のコードをインタラクティブに評価、コンパイル、およびロードする場合に役立ちます。
コンパイラーとインタープリターの作成を支援するために、いくつかの機能も提供されています。シンボルは第1レベルのオブジェクトで構成され、ユーザーコードによって直接操作できます。progvパッケージも操作可能ですしながら、特別な作業は、プログラム的字句バインディングを作成することができます。Lispコンパイラは、実行時にファイルまたは個々の関数をコンパイルするために使用できます。これらにより、Lispを別の言語の中間コンパイラまたはインタプリタとして簡単に使用できます。

コード例

誕生日のパラドックス
次のプログラムは、ユニークな誕生日の確率が50%未満の部屋の最小人数を計算します(誕生日のパラドックス、1人の場合は明らかに100%、2人の場合は364/365など。 )。答えは23です。
慣例により、CommonLispの定数は+文字で囲まれています。(defconstant + year-size + 365 )(defun Birthday -paradox (probability number-of-people ) (let ((new-probability (* (/ (- + year-size + number-of-people )+ year-size + )
probability ))) (if (< new -確率 0.5 )(1+ 人数)(誕生日のパラドックス 新しい確率 (1+ 人数)))))
REPL(Read Eval Print Loop)を使用してサンプル関数を呼び出す:
CL-USER>(誕生日-パラドックス1.0 1)23

人物オブジェクトのリストの並べ替え
person人の名前と年齢を表示するためのクラスとメソッドを定義します。次に、人のグループをpersonオブジェクトのリストとして定義します。次に、並べ替えられたリストを繰り返し処理します。(defclass person () ((name :initarg :name :accessor person-name ) (age :initarg :age :accessor person-age )) (:documentation “クラスPERSONとスロットNAMEおよびAGE。” ))(defmethod display ((object person ) stream ) “PERSONオブジェクトを出力ストリームに表示します。” (with-slots (name age ) object (format stream “〜a(〜a)” name age )))(defparameter *グループ* (リスト (メイクインスタンス 「人 :名称 『ボブ』 :年齢 33 )(メイクインスタンス 」人 :名称 『クリス』 :年齢 16 )(メイクインスタンス 「人 :名称 『アッシュ』 :年齢 23 )) “PERSONオブジェクトのリスト。” )(dolist (person (sort (copy-list * group * )
# ‘ >
:key #’ person-age )) (display person * standard-output * ) (terpri ))
3つの名前を年齢の降順で印刷します。
ボブ(33)アッシュ(23)クリス(16)

二乗による指数化
LOOPマクロの使用方法を示します。(defun power (x n ) (loop with result = 1
while (plusp n )
when (oddp n ) do (setf result (* result x ))
do (setf x (* x x )
n (truncate n 2 ))
finally (結果を返す )))
使用例:
CL-USER>(power 2 200)1606938044258990275541962092341162602522202993782792835301376
組み込みのべき乗と比較して
CL-USER>(=(expt 2 200)(power 2 200))T

利用可能なシェルのリストを見つける
WITH-OPEN-FILEは、ファイルを開いてストリームを提供するマクロです。フォームが返されると、ファイルは自動的に閉じられます。FUNCALLは関数オブジェクトを呼び出します。LOOPは、述部に一致するすべての行を収集します。(defun list-matching-lines (file predicate ) “ファイル内の行のリストを返します。その行に 適用された述語はTを返します。” (with-open-file (stream file ) (loop for line = (read- line stream nil nil ) while line when (funcall predicate line )
collect it )))
関数AVAILABLE-SHELLSは、パス名と無名関数を述語として、上記の関数LIST-MAT​​CHING-LINESを呼び出します。述語は、シェルまたはNILのパス名を返します(文字列がシェルのファイル名でない場合)。(defun available-shells (&optional (file #p “/ etc / shells” )) (list-matching-lines file (lambda (line ) (and (plusp (length line ))(char = (char line 0 ) # / ) (pathname (string-right-trim ‘ (# space # tab ) line ))))))
結果の例(Mac OS X 10.6の場合):
CL-USER > (使用可能-シェル)(#P “/ bin / bash” #P “/ bin / csh” #P “/ bin / ksh” #P “/ bin / sh” #P “/ bin / tcsh” #P “/ bin / zsh” )

他のLispとの比較
Common Lispは、Schemeと最も頻繁に比較され、対照的です—2つの最も人気のあるLisp方言であるという理由だけで。SchemeはCLに先行し、同じLispの伝統からではなく、同じengineers-の一部からだけではなく、来ガイ・スティール、誰とジェラルド・ジェイサスマンは、スキームを設計したCommon Lispのための標準化委員会の議長を務めました。
Common Lispは、特定の製品(それぞれ、GNU EmacsとAutoCAD)に組み込まれている拡張言語であるEmacs LispやAutoLISPなどのLispバリアントとは対照的に、汎用プログラミング言語です。以前の多くのLispとは異なり、Common Lisp(Schemeなど)は、解釈されたコードとコンパイルされたコードの両方にデフォルトで字句変数スコープを使用します。
ZetaLispやFranzLispなどの設計がCommonLispに貢献したほとんどのLispシステムは、インタプリタで動的スコープの変数を使用し、コンパイラで字句スコープの変数を使用していました。スキームは、字句スコープの変数の唯一の使用をLispに導入しました。ALGOL68からのインスピレーション。CLは動的スコープの変数もサポートしますが、それらは「特殊」として明示的に宣言する必要がANSI CLインタープリターとコンパイラーの間で、スコープに違いはありません。
Common Lispは、Lisp-2およびScheme a Lisp-1と呼ばれることもあり、CLが関数と変数に別々の名前空間を使用することを指します。(実際、CLには、goタグ、ブロック名、キーワードなど、多くの名前空間がありますloop)。CLとSchemeの支持者の間には、複数の名前空間に関係するトレードオフについて長年の論争がスキームでは、関数と衝突する変数名を付けないようにする必要がSchemeの関数は、頻繁に引数が命名したlis、lstあるいはlystないよう、システムの機能と競合しますlist。ただし、CLでは、関数を引数として渡すときに関数の名前空間を明示的に参照する必要がこれは、sort上記の例のように、よくあることです。
CLは、ブール値の処理においてもSchemeとは異なります。スキームは、特別な値#tと#fを使用して、真実と偽りを表します。CLは、記号TとNILを使用するという古いLisp規則に従い、NILは空のリストも表します。CLにおいては、任意の非NIL値は、次のような条件文で真として扱われるifスキームの値Fすべての非#が真として扱われ、一方、。これらの規則により、両方の言語の一部の演算子は、述語(ブール値の質問に答える)と、さらに計算するための有用な値の両方として機能できますが、Schemeでは、CommonLispのNILと同等の値 ‘()はtrueと評価されますブール式で。
最後に、Scheme標準ドキュメントには末尾呼び出しの最適化が必要ですが、CL標準には必要ありません。ほとんどのCL実装は末尾呼び出しの最適化を提供しますが、多くの場合、プログラマーが最適化ディレクティブを使用する場合に限ります。それにもかかわらず、一般的なCLのコーディングスタイルは、スキームのスタイルを好む、何というスキームプログラマは末尾再帰で表現します再帰のユビキタス使用を支持しない、CLのユーザーは、通常では、反復式で表現するだろうdo、dolist、loopと(最近で)、またはiterateパッケージ。

実装
カテゴリCommonLispの実装を参照して
Common Lispは、1つの実装(Perlなど)ではなく、仕様(AdaやCなど)によって定義されます。多くの実装があり、それらが有効に異なる可能性のある標準の詳細領域が
さらに、実装には拡張機能が付属する傾向があり、標準でカバーされていない機能を提供します。
インタラクティブトップレベル(REPL)
デバッガー、ステッパー、インスペクター
弱いデータ構造(ハッシュテーブル)
拡張可能なシーケンス
拡張可能なループ
環境へのアクセス
CLOSメタオブジェクトプロトコル
CLOSベースの拡張可能なストリーム
CLOSベースの条件システム
ネットワークストリーム
永続的なCLOS
Unicodeサポート
外国語インターフェース(多くの場合C)
オペレーティングシステムインターフェイス
Javaインターフェイス
スレッドとマルチプロセッシング
アプリケーション配信(アプリケーション、ダイナミックライブラリ)
画像の保存
無料のオープンソースソフトウェアライブラリは、移植可能な方法でCommon Lispの拡張機能をサポートするために作成されており、Common-Lisp.net およびCLOCC(Common Lisp Open Code Collection)プロジェクト。
Common Lispの実装では、ネイティブコードのコンパイル、バイトコードのコンパイル、または解釈を任意に組み合わせて使用​​できます。Common Lispは、インクリメンタルコンパイラ、ファイルコンパイラ、ブロックコンパイラをサポートするように設計されています。言語仕様では、コンパイルを最適化するための標準宣言(関数のインライン化や型の特殊化など)が提案されています。最も一般的なLisp実装は、ソースコードをネイティブマシンコードにコンパイルします。一部の実装では、(最適化された)スタンドアロンアプリケーションを作成できます。他のものは、解釈されたバイトコードにコンパイルされます。これは、ネイティブコードよりも効率的ではありませんが、バイナリコードの移植性を容易にします。一部のコンパイラは、CommonLispコードをCコードにコンパイルします。Lispが純粋に解釈された言語であるという誤解は、Lisp環境がインタラクティブなプロンプトを提供し、そのコードが1つずつ段階的にコンパイルされるためである可能性が最も高いです。Common Lispでは、インクリメンタルコンパイルが広く使用されています。
一部のUnixベースの実装(CLISP、SBCL)は、スクリプト言語として使用できます。つまり、PerlまたはUnixシェルインタープリターと同じようにシステムによって透過的に呼び出されます。
実装のリスト編集

商用実装
Allegro Common Lisp
Microsoft Windows、FreeBSD、Linux、Apple macOS、およびさまざまなUNIXバリアント用。Allegro CLは、
統合開発環境(IDE)(WindowsおよびLinux用)とアプリケーション配信のための広範な機能を提供します。
Liquid Common Lisp
以前はLucidCommonLispと呼ばれていました
。メンテナンスのみで、新しいリリースはありません。 LispWorks Microsoft Windows、FreeBSD、Linux、Apple macOS、iOS、Android、およびさまざまなUNIXバリアント用。LispWorksは、
統合開発環境(IDE)(ほとんどのプラットフォームで利用可能ですが、iOSとAndroidでは利用できません)とアプリケーション配信のための広範な機能を提供します。 mocl iOS、Android、macOS用。
オープンジェネラ
DECAlphaの場合。
Scieneer Common Lisp
これは、高性能の科学計算用に設計されています。

自由に再配布可能な実装
Armed Bear Common Lisp(ABCL)
Java仮想マシン
で実行されるCL実装 Javaバイトコードへのコンパイラが含まれており、
CLからJavaライブラリにアクセスできます。以前は、Armed Bear JEditorの単なるコンポーネントでした CLISP
バイトコードコンパイルの実装であり、移植可能であり、いくつかのUnixおよびUnixライクなシステム(macOSを含む)、およびMicrosoftWindowsやその他のいくつかのシステムで実行されます。
Clozure CL(CCL)
もともと
はMacintoshCommonLispの無料のオープンソースフォークです。その歴史が示すように、CCLはMacintosh用に作成されましたが、Clozure CLは現在、macOS、 FreeBSD、 Linux、
Solaris、および
Windowsで動作します。32ビットおよび64ビットの
x86ポートが各プラットフォームでサポートされています。さらに、MacOSおよびLinux用のPowerPCポートがCCLは以前はOpenMCLと呼ばれていましたが、Macintosh Common Lispのオープンソースバージョンとの混同を避けるために、その名前は使用されなくなりました。 CMUCL もともとから
カーネギーメロン大学、今のように維持し
、フリーでオープンソースソフトウェアボランティアのグループで。CMUCLは高速のネイティブコードコンパイラを使用します。Linuxおよび
BSDfor Intelx86で利用できますLinux for Alpha;
Intelx86およびPowerPC用のmacOS。ネイティブプラットフォーム上のSolaris、IRIX、およびHP-UX。
Corman Common Lisp
MicrosoftWindowsの場合。2015年1月、CormanLispはMITライセンスの下で公開されました。
埋め込み型CommonLisp(ECL)
ECLには、バイトコードインタープリターとコンパイラーが含まれています。また、Cコンパイラを介してLispコードをマシンコードにコンパイルすることもできます。次に、ECLはLispコードをCにコンパイルし、CコンパイラでCコードをコンパイルして、結果のマシンコードをロードできます。ECLをCプログラムに埋め込み、CコードをCommonLispプログラムに埋め込むこともでき GNU Common Lisp(GCL)
GNUプロジェクトのLispのコンパイラ。まだ完全にANSIに準拠していませんが、GCLは、数学ツールMaxima、
AXIOM、および(歴史的に)
ACL2を含むいくつかの大規模プロジェクトに最適な実装です
。GCLは、11の異なるアーキテクチャーの下でLinux上で実行され
、Windows、Solaris、およびFreeBSDの下でも実行され Macintosh Common Lisp(MCL)
Mac OSXを実行しているPowerPCプロセッサを搭載したAppleMacintoshコンピュータ用のバージョン5.2はオープンソースです。RMCL(MCL 5.2に基づく)は、AppleのRosettaバイナリトランスレータを使用するIntelベースのAppleMacintoshコンピュータで実行されます。
ManKai Common Lisp(MKCL) ECL のブランチ
。MKCLは、大幅に作り直された、ネイティブにマルチスレッド化されたランタイムシステムを通じて、信頼性、安定性、および全体的なコード品質を強調しています。Linuxでは、MKCLは完全にPOSIXに準拠したランタイムシステムを備えています。 Movitz 基盤となるOSに依存せずに
、x86コンピューター用のLisp環境を実装します ポップログ
Poplogは、POP-11、オプションで
Prolog、および
Standard ML(SML)を備えたバージョンのCLを実装し、
混合言語プログラミングを可能にします。結局のところ、実装言語はPOP-11であり、インクリメンタルにコンパイルされます。また、コンパイラと通信するEmacsのようなエディタが統合されてい Steel Bank Common Lisp(SBCL) CMUCL からのブランチ
。「大まかに言えば、SBCLは保守性をより重視することでCMUCLと区別されます。」
SBCLは、HP / UXを除くCMUCLが実行するプラットフォームで実行されます。さらに、Linux for AMD64、PowerPC、SPARC、MIPS、Windows x86
で実行され、WindowsAMD64での実行を実験的にサポートしています。SBCLはデフォルトではインタプリタを使用しません。ユーザーがインタープリターをオンにしない限り、すべての式はネイティブコードにコンパイルされます。SBCLコンパイラは、以前のバージョンのThe Computer Language BenchmarksGameに従って高速ネイティブコードを生成し
Ufasoft Common Lisp
C ++で記述されたコアを備えたWindowsプラットフォーム用のCLISPのポート。

その他の実装
オースティン京都CommonLisp
ビル・シェルターによる
Kyoto CommonLispの
進化
バタフライコモンリスプ
BBNButterflyマルチプロセッサコンピュータ
用のSchemeで記述された実装 CLICC CommonLispからCへのコンパイラCLOE ymbolicsに
よるPC用の CommonLisp Codemist Common Lisp
数式処理システムAxiomの商用バージョンに使用されます ExperCommon Lisp ExperTelligenceによるAppleMacintoshの初期の実装
ゴールデンコモンリスプ
GoldHillInc。によるPCの実装
Ibuki Common Lisp
京都コモンリスプの商品化バージョン
京都コモンリスプ
Cをターゲット言語として使用した最初のCommonLispコンパイラ。GCL、ECL、およびMKCLは、このCommonLisp実装に由来します。 L IS Robotics、現在はiRobotによって開発された組み込みシステム用のCommonLispの小さなバージョン
Lispマシン( Symbolics、TI
およびXerox
から)
ネイティブのLisp方言(Lisp Machine LispまたはInterlisp)に加えて、CommonLispの実装を提供しました。CLOSも利用可能でした。Symbolicsは、拡張バージョンのCommonLispを提供します。
Procyon Common Lisp
フランツがAllegroCLのWindowsポートに使用するWindowsおよびMacOSの実装
スターサファイアCommonLISP
PCの実装 SubL Cyc知識ベースシステムの
実装に使用されるCommonLispの変種
トップレベルのCommonLisp
同時実行の初期の実装 WCL 共有ライブラリの実装
VAX Common Lisp
ディジタル・イクイップメント・コーポレーションに実行されたことの実装
のVAXシステムが稼働してMSや LTRIXを XLISP
DavidBetzによって書かれた実装

アプリケーション
参照:
Category:Common Lisp(プログラミング言語)ソフトウェア
Common Lispは、研究アプリケーション(多くの場合、人工知能)の開発、プロトタイプの迅速な開発、または展開されたアプリケーションに使用されます。
Common Lispは、Yahoo!を含む多くの商用アプリケーションで使用されています。もともと関与ストアウェブコマースサイト、ポール・グレアムが、後に書き直されたC ++とPerlの。その他の注目すべき例は次のとおりです。
ACT-Rは、多数の研究プロジェクトで使用されている認知アーキテクチャです。
Authorizer’s Assistant、 American Expressが使用する大規模なルールベースのシステムで、クレジットリクエストを分析します。
Cycは、膨大な量の常識知識を提供する知識ベースのシステムを作成するための長期にわたるプロジェクトです。
Gensym G2、リアルタイムエキスパートシステムおよびビジネスルールエンジン
Genworks GDL、オープンソースのGendlカーネルに基づいています。
以下のための開発環境のJakとDaxterによって開発されたビデオゲームシリーズ、いたずらな犬。
ITAソフトウェアの旅行のようなウェブサイトで使用されるの低運賃検索エンジン、海外とKayak.comなどの航空会社アメリカン航空、コンチネンタル航空とUSエアウェイズ。
みらいちゃん、3Dグラフィックススイート。これは、映画「ロードオブザリング:2つの塔」でゴラムの顔をアニメーション化するために使用されました。
Opusmodusは、Common Lispに基づく音楽作曲システムであり、コンピューター支援作曲で使用されます。
プロトタイプ検証システム(PVS)、正式な仕様と検証のための機械化された環境。
PWGLは、Common Lispに基づく洗練されたビジュアルプログラミング環境であり、コンピューター支援の作曲とサウンド合成で使用されます。
Common Lispで書かれた完全な航空機分析スイートであるPiano は、ボーイング、エアバス、ノースロップグラマンなどの企業で使用されています。
英語のライティング強化プラットフォームであるGrammarlyには、CommonLispで記述されたコア文法エンジンが
動的解析と再計画ツールのみに言われて(DART)は、すべての30年間、1991年から1995年の間に背を支払ったDARPAのAIの研究への投資。
NASAのジェット推進研究所の「DeepSpace1」は、Deep SpaceOne宇宙船を自動操縦するための受賞歴のある Common Lisp プログラムです。
SigLabは、ミサイル防衛で使用される信号処理用のCommon Lispプラットフォームであり、Raytheonによって構築されました。
NASAのマーズパスファインダーミッション計画システム。
SPIKE、地球または宇宙ベースの天文台および衛星、特にハッブル宇宙望遠鏡のスケジューリングシステムは、CommonLispで書かれています。
Common Lispは、Microsoftの.NET Common LanguageRuntimeのガベージコレクターのプロトタイピングに使用されています。
元のバージョンのReddit、開発者は後でに切り替えてもパイソンのRedditの共同創設者の公式ブログの記事によると、原因のCommon Lisp用のライブラリの不足のためにスティーブ・ハフマン。
CommonLispで書かれた次のようなオープンソースアプリケーションも
ACL2、フル機能の自動化された定理証明のためのApplicative Common Lispのの変種。
Axiom、洗練された数式処理システム。
Maximaは、Macsymaをベースにした洗練された数式処理システムです。
OpenMusicは、Common Lispに基づくオブジェクト指向のビジュアルプログラミング環境であり、コンピューター支援の作曲で使用されます。
Pgloader、 PostgreSQL用のデータローダー。PythonからCommonLispに書き直されました。
Stumpwmは、完全にCommonLispで記述されたタイリングのキーボード駆動のX11ウィンドウマネージャーです。

も参照してください
icon"
 コンピュータプログラミングポータル
Common Lisp the Language
Lispについて
実用的なCommonLisp

参考文献
^ 「ANSI規格アクション-2018年12月28日」 (PDF)。ansi.org。
^ 引用された標準の表紙から引用。ANSI INCITS 226-1994 、標準のドキュメントページ で販売されています。 2020年9月27日、WaybackMachineでアーカイブされました。
^ 「CLHS:Common Lisp HyperSpec(TM)について」。lispworks.com。
^ 「CLHS:セクション1.1.2」。lispworks.com。
^ 「CommonLispの実装:調査」。2012年4月21日にオリジナルからアーカイブされました。
^ 「古いLISPプログラムはまだCommonLispで実行されています」。
^ 「「Yu-ShiangLisp」のルーツ、Jon L Whiteからのメール、1982年」。cmu.edu。
^ 「メールインデックス」。cl-su-ai.lisp.se。
^ 膝ジャークアンチLOOPismおよび他のEメール現象:オーラル、書かれており、コンピュータ媒介コミュニケーション、ジョアン・イェーツとワンダJ. Orlikowskiにおける電子パターン、1993 アーカイブ2012年8月8日、時ウェイバックマシン ^ Jr、スティール; L、ガイ(1982年8月15日)。COMMONLISPの概要。Lfp’82。ACM。pp。98–107。土井:10.1145 /800068.802140。ISBN  9780897910828。S2CID  14517358。
^ Reddy、Abhishek(2008年8月22日)。「CommonLispの機能」。
^ 「Unicodeサポート」。Common LispWiki 。
^ リチャードP.ガブリエル; ケントM.ピットマン(1988年6月)。「機能セルと値セルの分離の技術的問題」。Lispおよび記号計算。1(1):81–101。土井:10.1007 / bf01806178。S2CID 26716515。   ^ 「CommonLispHyperspec:セクション3.1.7」。
^ 「CommonLispHyperspec:FunctionFLOOR」。
^ 「CommonLispHyperspec:AccessorGETHASH」。
^ 「LetOverLambda」。letoverlambda.com。
^ Peter Seibel(2005年4月7日)。実用的なCommonLisp。押してISBN  978-1-59059-239-7。
^ 「動的計画法のデザインパターン」。norvig.com。
^ Common-Lisp.net ^ CommonLispオープンコードコレクション ^ 「32.6。CLISPによるクイックスタート配信」。clisp.cons.org。
^ 「武装したクマのCommonLisp」。
^ 「CormanLispソースが利用可能になりました」。
^ 「歴史と著作権」。Steel Bank CommonLisp。
^ 「プラットフォームテーブル」。Steel Bank CommonLisp。
^ 「どのプログラムが最速ですか?–コンピュータ言語ベンチマークゲーム」。5月20日から2013年アーカイブの元2013年5月20日に。
^ 「パッケージ:lang / lisp / impl / bbn /」。cs.cmu.edu。
^ 「ButterflyLispの最近の開発、1987年、AAAI議事録」(PDF)。aaai.org。
^ Burkart、O。; Goerigk、W。; Knutzen、H。(1992年6月22日)。「CLICC:CへのCommonLispプログラムのコンパイルへの新しいアプローチ」。CiteSeerX 10.1.1.38.1282。   ^ “”codemist.co.uk””。lisp.codemist.co.uk。
^ 公理、30年の地平線、43ページ ^ 「GoldenCommonLisp開発者」。goldhill-inc.com。
^ Golden Common LISP:A Hands-On Approach、David J. Steele、2000年6月、Addison Wesley Publishing Company ^ ブルックス、ロドニーA。; al。、et(1995年6月22日)。「L–組み込みシステムのCommonLisp」。CiteSeerX 10.1.1.2.1953。   ^ TIエクスプローラプログラミングの概念 ^ TI ExplorerLispリファレンス ^ MedleyLispリリースノート ^ 「SymbolicsCommonLisp辞書」(PDF)。trailing-edge.com。
^ 「シンボリックスの一般的なLisp言語の概念」(PDF)。trailing-edge.com。
^ 「SymbolicsCommonLispプログラミング構造」(PDF)。trailing-edge.com。
^ 「SubLリファレンス–Cycorp」。cyc.com。
^ 「トップレベル株式会社–ソフトウェア保存グループ」。softwarepreservation.org。
^ WCL:Unixでの効率的なCommon Lispアプリケーションの提供、LISPと関数型プログラミングに関する1992年のACM会議の議事録、 260〜269ページ ^ “”commonlisp.net :: WCL””。pgc.com。2016年4月5日にオリジナルからアーカイブされました。
^ 「パッケージ:lang / lisp / impl / xlisp /」。cs.cmu.edu。
^ 「平均を破る」。paulgraham.com。
^ 「承認者のアシスタント」(PDF)。aaai.org。
^ アメリカン・エキスプレスオーソのアシスタント アーカイブで2009年12月12日、ウェイバックマシン ^ リアルタイムアプリケーションの開発 アーカイブで2016年8月2日、ウェイバックマシン。Gensym。
^ Genworks GDL ^ Opusmodus –ホーム ^ PWGL –ホーム、 ^ “”Aerospace – CommonLisp””。lisp-lang.org。
^ ピアノユーザー、メーカーページから取得 ^ Grammarly.com、本番環境でLispを実行 ^ 「リモートエージェント」。ti.arc.nasa.gov。
^ JPLでのリスピング ^ 「FranzIncカスタマーアプリケーション:NASA」。franz.com。
^ スパイク計画およびスケジューリングシステム。Stsci.edu。
^ 「FranzIncカスタマーアプリケーション:宇宙望遠鏡研究所」。franz.com。
^ 「すべての始まり…別名CLRの誕生」。microsoft.com。
^ ハフマン、スティーブ。「lispで」。賛成。2018年5月17日にオリジナルからアーカイブされました。
^ Pgloader ^ pgloaderが非常に高速なのはなぜですか

参考文献
Common Lisp(言語)またはCommon Lispを使用したプログラミング(特にAIプログラミング)について出版された(または出版されようとしている)本の年代順のリスト。
Guy L. Steele:Common Lisp the Language、第1版、Digital Press、1984年、 ISBN 0-932376-41-X 
Rodney Allen Brooks:Programming in Common Lisp、John Wiley and Sons Inc、1985、 ISBN 0-471-81888-7 
リチャードP.ガブリエル:Lispシステムのパフォーマンスと評価、 MIT Press、1985、 ISBN 0-262-57193-5、PDF 
Robert Wilensky:Common LISPcraft、WW Norton&Co.、1986、 ISBN 0-393-95544-3 
Eugene Charniak、Christopher K. Riesbeck、Drew V. McDermott、James R. Meehan:Artificial Intelligence Programming、第2版、Lawrence Erlbaum、1987、 ISBN 0-89859-609-2 
Wendy L. Milner:Common Lisp:A Tutorial、Prentice Hall、1987、 ISBN 0-13-152844-0 
Deborah G. Tatar:Common Lispのプログラマーズガイド、Longman Higher Education、1987、 ISBN 0-13-728940-5 
湯浅泰一、萩谷正美:Common Lispの紹介、Elsevier Ltd、1987、 ISBN 0-12-774860-1 
Christian Queinnec、Jerome Chailloux:Lisp Evolution and Standardization、Ios Pr Inc.、1988、 ISBN 90-5199-008-1 
湯浅泰一、Richard Weyhrauch、北島靖子:Common Lisp Drill、Academic Press Inc、1988、 ISBN 0-12-774861-X 
Wade L. Hennessey:Common Lisp、McGraw-Hill Inc.、1989、 ISBN 0-07-028177-7 
Tony Hasemer、John Dominque:人工知能のための一般的なLispプログラミング、Addison-Wesley Educational Publishers Inc、1989、 ISBN 0-201-17579-7 
Sonya E. Keene:Common Lispのオブジェクト指向プログラミング:CLOSのプログラマーズガイド、Addison-Wesley、1989、 ISBN 0-201-17589-4 
David Jay Steele:Golden Common Lisp:A Hands-On Approach、Addison Wesley、1989、 ISBN 0-201-41653-0 
デイビット・S・トゥーレッツキー:Common Lispに:記号計算にAジェントルはじめ、ベンジャミン・カミングス、1989、 ISBN 0-8053-0492-4。Web / PDF Dover reprint(2013) ISBN 978-0486498201  
Christopher K. Riesbeck、Roger C. Schank:Inside Case-Based Reasoning、Lawrence Erlbaum、1989、 ISBN 0-89859-767-6 
Patrick Winston、Berthold Horn:Lisp、第3版、Addison-Wesley、1989、 ISBN 0-201-08319-1、Web 
Gerard Gazdar、Chris Mellish:LISPでの自然言語処理:計算言語学入門、Addison-Wesley Longman Publishing Co.、1990、 ISBN 0-201-17825-7 
Patrick R. Harrison:Common Lisp and Artificial Intelligence、Prentice Hall PTR、1990、 ISBN 0-13-155243-0 
Timothy Koschmann:The Common Lisp Companion、John Wiley&Sons、1990、 ISBN 0-471-50308-8 
W.リチャードスターク:LISP、Lore、およびLogic、Springer Verlag New York Inc.、1990、 ISBN 978-0-387-97072-1、PDF 
Molly M. Miller、Eric Benson:Lisp Style&Design、Digital Press、1990、 ISBN 1-55558-044-0 
Guy L. Steele:Common Lisp the Language、第2版、Digital Press、1990、 ISBN 1-55558-041-6、Web 
Robin Jones、Clive Maynard、Ian Stewart:The Art of Lisp Programming、Springer Verlag New York Inc.、1990、 ISBN 978-3-540-19568-9、PDF 
Steven L. Tanimoto:Common Lispを使用した人工知能の要素、Computer Science Press、1990、 ISBN 0-7167-8230-8 
Peter Lee:高度な言語実装のトピック、 MIT Press、1991、 ISBN 0-262-12151-4 
John H. Riley:A Common Lisp Workbook、Prentice Hall、1991、 ISBN 0-13-155797-1 
Peter Norvig:人工知能プログラミングのパラダイム:Common Lispのケーススタディ、Morgan Kaufmann、1991、 ISBN 1-55860-191-0、Web 
Gregor Kiczales、Jim des Rivieres、Daniel G. Bobrow:The Art of the Metaobject Protocol、MIT Press、1991、 ISBN 0-262-61074-4 
Jo A. Lawless、Molly M. Miller:CLOSを理解する:The Common Lisp Object System、Digital Press、1991、 ISBN 0-13-717232-X 
Mark Watson:Common Lisp Modules:Neural Networks and Chaos Theoryの時代の人工知能、Springer Verlag New York Inc.、1991、 ISBN 0-387-97614-0、PDF 
James L. Noyes:Common Lispを使用した人工知能:記号および数値処理の基礎、Jones&Bartlett Pub、1992、 ISBN 0-669-19473-5 
Stuart C. Shapiro:COMMON LISP:Interactive Approach、Computer Science Press、1992、 ISBN 0-7167-8218-9、Web / PDF 
Kenneth D. Forbus、Johan de Kleer:Building Problem Solvers、MIT Press、1993、 ISBN 0-262-06157-0 
Andreas Paepcke:オブジェクト指向プログラミング:CLOSパースペクティブ、MIT Press、1993、 ISBN 0-262-16136-2 
Paul Graham:On Lisp、Prentice Hall、1993、 ISBN 0-13-030552-9、Web / PDF 
Paul Graham:ANSI Common Lisp、Prentice Hall、1995、 ISBN 0-13-370875-6 
Otto Mayer:Programmieren in Common Lisp、German、Spektrum Akademischer Verlag、1995、 ISBN 3-86025-710-2 
Stephen Slade:Object-Oriented Common Lisp、Prentice Hall、1997、 ISBN 0-13-605940-6 
リチャードP.ガブリエル:ソフトウェアのパターン:ソフトウェアコミュニティからの物語、オックスフォード大学出版局、1998年、 ISBN 0-19-512123-6、PDF 
湯浅泰一、奥野宏:Advanced Lisp Technology、CRC、2002、 ISBN 0-415-29819-9 
デビッド・B・Lamkins:成功のLisp:どのように理解し、使用Common Lispの、bookfix.com、2004年
ISBN 3-937526-00-5、ウェブ 
ピーター・サイベル:実践Common Lispの、プレスカンファレンス、2005年
ISBN 1-59059-239-5、ウェブ 
Doug Hoyte:Let Over Lambda、Lulu.com、2008、 ISBN 1-4357-1275-7、Web 
George F. Luger、William A. Stubblefield:AIアルゴリズム、データ構造、およびProlog、Lisp、Javaのイディオム、Addison Wesley、2008年、 ISBN 0-13-607047-7、PDF 
Conrad Barski:Land of Lisp:一度に1つのゲームで、Lispでプログラミングする方法を学びましょう!、ノースターチプレス、2010年、 ISBN 1-59327-200-6、Web 
Pavel Penev:Lisp Web Tales、Leanpub、2013、Web
Edmund Weitz:Common Lisp Recipes、Apress、2015、 ISBN 978-1-484211-77-9、Web 
Patrick M. Krusenotto:Funktionale Programmierung und Metaprogrammierung 、Interaktiv in Common Lisp、Springer Fachmedien Wiesbaden 2016、 ISBN 978-3-658-13743-4、Web 

外部リンク
ウィキブックスには、次のトピックに関する詳細があります:Common Lisp
Quicklisp – CommonLispの非常に人気のある高品質のライブラリマネージャー
素晴らしいCLのリスト、Common Lispのフレームワークやライブラリのキュレーションリスト。
Common Lispのクックブック、共同プロジェクト。
CLikiは、Unixライクなシステムで実行される無料のオープンソースのCommonLispシステムのWikiです。
ソフトウェア用の無料のCommonLispの主要なリポジトリの1つは、Common-Lisp.netです。
lisp-lang.orgには、ドキュメントとサクセスストーリーのショーケースが
Common Lispの歴史の概要:
「歴史」。Common LispHyperSpec。
Common Lispクイックリファレンス– CommonLisp標準言語のコンパクトな概要。
CommonLispに関するPlanetLispの記事。
Quickdocsは、多くのQuicklispプロジェクトのドキュメントと依存関係情報をまとめたものです。

「https://en.wikipedia.org/w/index.php?title=Common_Lisp&oldid=1062693371」
から取得”