Lispの標準(の、ひとつ)であり、Lisp方言のひとつである。Lispの略称はCL(ごくまれにclispとも。CLISPという実装が実在するので混同回避のためあまり用いられない)。仕様を指すこともあれば、実装を指すこともある。いくつかの、フリーソフトウェアの定義に合致したライセンスによりライセンスされている実装や、オープンソースの定義に合致したライセンスによりライセンスされている実装や、プロプライエタリなライセンスによりライセンスされている実装がある。■テンプレートLispの基本的な特徴の他、いくつかのプログラミングパラダイムのLispへの取り込みについて標準を提供しているという、マルチパラダイムプログラミング言語という面がある。関数型だけでなく、progなど手続き型的な言語要素に関しても標準化している。関数単位の細かで反復的なコンパイルにより、効率的な実行を可能にすると同時にREPLによる動的で迅速な開発をサポートする。Bignumなどを一級オブジェクトとして持つ。すべてはオブジェクト。Systemを備える。assert関数による基本的なテスト駆動開発が可能。「例外/ハンドラ」の処理をさらに一段階分離した「Condition/Restart/Handler」による例外処理。マクロ(プログラムによるコンパイル時のコード変換)やリーダーマクロ(特定の文字に対して新しく構文を拡張する)といった標準機能により言語を拡張可能。非常に単純な「左から右」、「内側から外側」モデルである(「左から右」を標準で決めているという点は特徴と言えるかもしれない(プログラミング言語の他の標準では決められていないものも多い))。左から右へ順番に評価し、最後にFにその引数を渡す。Fがマクロならば、まずマクロを展開する。Lispでは(Schemeと同様な)静的スコープが標準化された。Lispの型システムは階層的である。型はdeftypeを用いて定義され、typeはsupertype,subtypeという概念を持つ。(他の言語におけるtrueやObject)をもつ。従って、全てのオブジェクトは型tのインスタンスである。型nilは、どのオブジェクトもそのインスタンスにならない型である。[1]型にはbuilt-inな型とそうでないものがある。いった(他の言語で言う)プリミティブな型に、配列やストリームなど組み込みの型を合わせたものである。built-inでない型には、構造体、クラスなどがある。このように、型システムはクラスおよびオブジェクトシステムと連続的に融合されている。specifierという記述方式で参照され、これはよくtypespecと省略される。Typeという概念がある。大雑把には、引数を取ることのことができる型である。7))は、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。Typeでは、本来の型に合わせて、特定の一変数関数を型判定に用いることもできる。以下のように定義できる。LispにはHaskellにおけるような型変数の概念はない。上のarrayの例における引数は、変数ではなく定数として処理されるためである。Lispにおけるアトムとは、誤解を恐れず簡単に言うとlispにおいて「括弧によって囲まれないアトム」すべてを指す。シンボル、文字列、文字もアトムである。して定義されている[3]。用いて任意のサイズと精度を実現している。有理数型が分数として正確に表現されるという点は、他の言語にあまり見られない特徴である。自動的にそれぞれの数値型を適切に変換する。文字型(char)は、ASCII文字の範囲に限定されない。以前からあった事を考えれば驚くようなことではない。文字をサポートしている[4]文字列は、下で述べるシーケンスのsubtypeである。言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは値セル[5]と関数セル[6]が最も重要なものである。シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。キーワードパッケージ中のシンボルはすべて自己評価シンボルである。パッケージと呼ばれるシンボルのための名前空間を備えている。おけるシーケンス型は、リスト、ベクタ、ビットベクタ、文字列からなる。mapやreduceなどの多くの操作は、任意のシーケンス型に対して動作する。リストはコンス[7](コンスセル[8]、ペア[9]とも呼ばれる)で構成される。コンスセルはcarとcdrの二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。スロットは次のコンスセルを参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。配列をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。多次元配列は行列演算に利用される。ベクタは一次元の配列である。配列は任意の型を要素として持つことができる(一つの配列に複数の型の要素を混在させることもできる)が、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。型指定された配列のなかで二種類が標準で定義されている。文字列は文字を要素としたベクタであり、ビットのベクタはビットベクタである。ビットベクタとベクタはシーケンスのsubtypeでもある。その他編集ハッシュテーブルはデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように必要に応じて動的にリサイズされる。分割するために使用される。パッケージはいくつかのシンボルをエクスポート[10]することで、インターフェースを公開する。レコードに似た、複数の型と値のフィールド(スロットと呼ばれる)で構成される複合的なデータ構造である。よって作られるものである。データ型の一つである。これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。これにより、非常に汎用化された操作を記述できるようになる。ライブラリは、多くの部分が高階関数の上に成りたっている。これは、比較関数が任意の型のデータを整列できるだけでなく、キーによって任意のデータ構造を整列することも可能にする。マクロは関数を定義する。関数定義は名前と、引数の名前、そして関数本体で構成される。システムに対話的なドキュメンテーションを与えるためのドキュメンテーション文字列[13]を含むことがある。式を用いて定義される。的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。関数の定義や操作に関する多くのオペレータが存在する。よって再コンパイルされる場合がある。システムでは、明示的なコンパイル命令があるまで、デフォルトでは関数をインタプリタで実行するものや、オンザフライで関数を実行するたびにコンパイルするものなどがある)総称関数とメソッドの定義編集defgenericマクロは、総称関数(ジェネリック関数)を定義する。defmethodマクロはメソッドを定義する。総称関数はメソッドの集合である。メソッドはそのパラメータとして渡されたクラスやオブジェクトによって特定化される。総称関数が呼び出されると、マルチメソッドディスパッチ(多重メソッドディスパッチ)により、実際に使用されるメソッドが決定される。5総称関数もファーストクラスのデータ型である。総称関数やメソッドには上に記載したよりも、もっと豊富な機能が存在する。ための名前空間は、データ変数のための名前空間とは分離されている。おける主要な違いである。ようなオペレータは関数名前空間へ名前を定義する。略記される)を使う必要がある。いうコードで参照している。評価モデルはより単純で、単一の名前空間のみが存在し、引数部分だけでなくあらゆる位置で、評価順序を問わずフォームは評価される。どちらかの方言で書かれたコードは、ときどき他方の経験を持つプログラマーを混乱させることになる。ローカルに関数名を上書きしてしまうという問題を起こすことになる。これには一長一短がある。名前空間が別れているために、高階関数などに渡す関数の名前は、そのままではなく、関数の名前であることを明示する必要が発生してしまっている。コミュニティにおける論争の源となっている。年の論文で作られた[14]。おけるファイルやディレクトリを表現する。パス名機能は、ほとんどのオペレーティングシステムのファイル命名規則より一般的なものであり、プログラムが様々なシステムを通してポータブルにファイルにアクセスする事を可能としている。入出力ストリームは、端末や開かれているファイルのような、バイナリデータ、テキストデータの入力元と出力先を表現する。擬似乱数生成器(PRNG)を備えている。ランダムな状態オブジェクトは擬似乱数のソースとして再利用可能であり、ユーザーが乱数の種を与える事や、同じ数列を再生する事を許可している。コンディション[15]はエラーや例外、その他のプログラムが反応する可能性がある有意なイベントを表現するための型である。クラス[16]は第一級のオブジェクトである。それ自身がメタクラス[17]と呼ばれるクラスのインスタンスである。プログラムも変数や関数、その他の要素を参照するために名前を用いる。名前が参照するものは、スコープによって決定されている。名前と、それが参照する実体との関係を束縛(バインディング[18])と呼ばれている。マクロ編集LISP系言語におけるマクロは、表面上は関数と同じように使われる。それは評価される式を表すというよりプログラムのソースコードの変形を表現している。マクロはプログラマーに言語内に新しい構文フォームを作る事を可能とする。ループのためのフォームを実現する。"Hello"))すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。式)を受けとり、それを変更して返す関数だと考えることができる。これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。オペレータ(あるいは自作のオペレータ)を使うことができる。よって提供されているものである。マクロには、マクロ展開されたコードに、呼び出し側の文脈で使われているシンボルが出現する変数キャプチャという機能がある。これは、プログラマが特殊な意味をもつシンボルを備えたマクロを作ることを可能とする。変数キャプチャは予期しない、一風変わったエラーを引き起こす可能性がある。LISP系のシステムでは、変数キャプチャを許さないマクロ構文[19]を備えているものもある。オペレータを使って回避するのが一般的である。その他の問題として、不用意なマクロ展開時のオペレータのシャドウイングがある。呼び出しへと展開される事になる。異なる意味を持つことになる。ような組み込みオペレータの再定義を禁止することで、オペレータのシャドウイング問題を和らげようとしている。ユーザーはそれぞれ自分のコードをパッケージに分離する事ができる。パッケージで見つけることができる。System(CLOS)を備えている。これは、現在利用可能な言語の中で、もっとも強力なオブジェクトシステムの一つである。標準規格の一部として採用された。ような静的な言語のオブジェクト指向機能とは根本的に異なったものである。LISP系言語だからだ。委員会の議長を務めた。同様な、スコープは静的スコープのみを基本とする仕様である。設計に寄与した実装の多くは、インタプリタでは動的スコープを、コンパイラでは静的スコープ、という仕様になっていた。Schemeはそういったものとは異なり、静的スコープのみであった。インタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。「Lisp-1」と呼ばれることがある。関数名と変数名(2つ)にそれぞれ独立した名前を備えている事に起因した名前である。キーワードなど多くの名前空間を持っているし、マクロをうまく使えば、構文的に名前空間を追加することも出来る。それぞれを支持する論争が長いあいだ行われている。いった関数名と衝突しないような引数名を取ることになる。引数として使う場合に、明示的に関数の名前空間を参照する必要がある。サンプルのように一般的なことである。いう特別な値を用いている。nil[21]を使っている。ない値が真として扱われる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。実装は末尾再帰の最適化を提供するが、それでもプログラマーが最適化宣言を使った場合のみである場合が多い。スタイルで好まれるようなあらゆる場合に再帰を使うというやり方とは異なっている。パッケージを使って反復で表現する。C言語のように仕様によって規定されている。実装は、標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。ライブラリが作成されている。インクリメンタルなコンパイラとして実装されるように設計された。関数のインライン展開のような最適化コンパイルのための標準的な宣言が言語規格に提案されている。実装は関数を機械語へとコンパイルし、Lispの環境を含めたコアダンプとして出力する。環境がインタラクティブなプロンプトを提供し、関数をその都度コンパイルするということに起因している。分岐して保守性を大幅に強化した処理系[23]であり、現在通常のx86コンピュータで最も使用されている実装の一つ。REPLから入力された評価式であっても、インタプリタを介さず全てネイティブコードにコンパイルしてから実行する[24]。CMUCL譲りのコンパイラにより非常に強力な最適化を行うことが出来、生成するコードはC言語のコードを上回ることもある。