Common Lisp
（コモン・リスプ）は、コンピュータ・プログラミング言語 Lispの標準（の、ひとつ）であり、Lisp方言のひとつである。Common Lispの略称はCL(ごくまれにclispとも。なおCLISPという実装が実在するので混同回避のためあまり用いられない)。規格はANSIによる ANSI INCITS X3.226-1994 (R2004) 。仕様を指すこともあれば、実装を指すこともある。いくつかの、フリーソフトウェアの定義に合致したライセンスによりライセンスされている実装や、オープンソースの定義に合致したライセンスによりライセンスされている実装や、プロプライエタリなライセンスによりライセンスされている実装がある。
Lispの基本的な特徴の他、いくつかのプログラミングパラダイムのLispへの取り込みについて標準を提供しているという、マルチパラダイムプログラミング言語という面がある。一般的なLispと同様のS式による構文である。
評価順は、非常に単純な「左から右」、「内側から外側」モデルである（「左から右」を標準で決めているという点は特徴と言えるかもしれない（プログラミング言語の他の標準では決められていないものも多い））。
codice_1 のようなS式で、codice_2が関数ならば、その引数 A1、A2 を左から右へ順番に評価し、最後にFにその引数を渡す。codice_2がマクロならば、まずマクロを展開する。
以前のLispでは動的スコープのものも多かったが、Common Lispでは（Schemeと同様な）静的スコープが標準化された。
Common Lispの型システムは階層的である。型はdeftypeを用いて定義され、typeは"supertype","subtype"という概念を持つ。すべての "type" は "supertype" として "t" (他の言語における"true"や"Object")をもつ。従って、全てのオブジェクトは型"t"のインスタンスである。一方、型"nil"は、どのオブジェクトもそのインスタンスにならない型である。
型には"built-in"な型とそうでないものがある。"built-in"な型は、整数、浮動小数、複素数、文字等といった(他の言語で言う)プリミティブな型に、配列やストリームなど組み込みの型を合わせたものである。"built-in"でない型には、構造体、クラスなどがある。このように、型システムはクラスおよびオブジェクトシステムと連続的に融合されている。
型は "type specifier"という記述方式で参照され、これはよく"typespec"と省略される。"typespec"を用いて議論する上で、"built-in"とは直交する概念として、"Atomic Type" 対 "Compound Type"という概念がある。Compound type は、大雑把には、引数を取ることのことができる型である。例えば、codice_4は、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。
"Compound Type"では、本来の型に合わせて、特定の一変数関数を型判定に用いることもできる。例えば、型 "mod3" を以下のように定義できる。
しかし、Common LispにはHaskellにおけるような型変数の概念はない。上の"array"の例における引数は、変数ではなく定数として処理されるためである。
Common Lispにおけるアトムとは、誤解を恐れず簡単に言うとlispにおいて「括弧によって囲まれないアトム」すべてを指す。数値はアトムである。シンボル、文字列、文字もアトムである。ANSI CLでは、Compound type codice_5として定義されている。
様々な型がある。 の文字型(char)は、文字の範囲に限定されない。これは が 以前からあった事を考えれば驚くようなことではない。いくつかの最近の処理系は 文字をサポートしている文字列は、下で述べるシーケンスのsubtypeである。
シンボル型は 言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは値セルと関数セルが最も重要なものである。シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。例えば、キーワードパッケージ中のシンボルはすべて自己評価シンボルである。 における真偽値は、自己評価シンボル codice_6 と codice_7 によって表現される。 はパッケージと呼ばれるシンボルのための名前空間を備えている。
におけるシーケンス型は、リスト、ベクタ、ビットベクタ、文字列からなる。mapやreduceなどの多くの操作は、任意のシーケンス型に対して動作する。
他の 系の言語と同様、 のリストはコンス（コンスセル、ペアとも呼ばれる）で構成される。コンスセルはcarとcdrの二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。それぞれのコンスセルの codice_8 スロットはリストの要素（他のリストである可能性もある）を参照し、codice_9 スロットは次のコンスセルを参照する。ただし、最後のコンスセルの codice_9 だけは nil を参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。
は多次元の 配列をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。多次元配列は行列演算に利用される。ベクタは一次元の配列である。配列は任意の型を要素として持つことができる（一つの配列に複数の型の要素を混在させることもできる）が、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。型指定された配列のなかで二種類が標準で定義されている。文字列は文字を要素としたベクタであり、ビットのベクタはビットベクタである。
ビットベクタとベクタはシーケンスのsubtypeでもある。
ハッシュテーブルはデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように必要に応じて動的にリサイズされる。パッケージはシンボルの集合であり、主にプログラムの一部を 名前空間 で分割するために使用される。パッケージはいくつかのシンボルをエクスポートすることで、インターフェースを公開する。構造体 は C言語の構造体や のレコードに似た、複数の型と値のフィールド（スロットと呼ばれる）で構成される複合的なデータ構造である。クラスのインスタンスは構造体に似ているが、これはオブジェクトシステム によって作られるものである。
では、関数 もデータ型の一つである。たとえば、これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。これにより、非常に汎用化された操作を記述できるようになる。このため、 のライブラリは、多くの部分が高階関数の上に成りたっている。たとえば、codice_11 関数は、引数として 比較オペレータ を取る。これは、比較関数が任意の型のデータを整列できるだけでなく、キーによって任意のデータ構造を整列することも可能にする。
codice_12 マクロは関数を定義する。関数定義は名前と、引数の名前、そして関数本体で構成される。
関数定義は、コンパイラに最適化設定や引数のデータ型を指定に関するヒントを与えるための 宣言や、 システムに対話的なドキュメンテーションを与えるためのドキュメンテーション文字列を含むことがある。
無名関数は codice_13 式を用いて定義される。 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。
関数の定義や操作に関する多くのオペレータが存在する。たとえば、関数は codice_14 によって再コンパイルされる場合がある。(いくつかの システムでは、明示的なコンパイル命令があるまで、デフォルトでは関数をインタプリタで実行するものや、オンザフライで関数を実行するたびにコンパイルするものなどがある)
codice_15マクロは、総称関数（ジェネリック関数）を定義する。codice_16マクロはメソッドを定義する。総称関数はメソッドの集合である。メソッドはそのパラメータとして渡されたクラスやオブジェクトによって特定化される。総称関数が呼び出されると、マルチメソッドディスパッチ（多重メソッドディスパッチ）により、実際に使用されるメソッドが決定される。
総称関数もファーストクラスのデータ型である。
総称関数やメソッドには上に記載したよりも、もっと豊富な機能が存在する。
関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは と における主要な違いである。codice_12、codice_18 そして codice_19 のようなオペレータは関数名前空間へ名前を定義する。
他の関数への引数として関数名を渡す場合には、codice_20 スペシャルオペレータ（通常 codice_21 と略記される）を使う必要がある。最初の codice_11 引数では、関数名前空間にシンボル codice_23 で定義された関数名を codice_24 というコードで参照している。
関数に独立した名前空間を持つ事が利点かどうかは、 コミュニティにおける論争の源となっている。この論争は一般に「 の議論」と言われる。この用語は リチャード・ガブリエル と ケント・ピットマン らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた。
が備えている他の型は以下の通り:他のプログラミング言語におけるプログラムと同様に、 のプログラムも変数や関数、その他の要素を参照するために名前を用いる。名前が参照するものは、スコープによって決定されている。
名前と、それが参照する実体との関係を束縛（バインディング）と呼ばれている。
系言語におけるマクロは、表面上は関数と同じように使われる。しかし、それは評価される式を表すというよりプログラムのソースコードの変形を表現している。
マクロはプログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは Perl のような言語で馴染みのある codice_27 ループのためのフォームを実現する。
すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。マクロは抽象構文木（S 式）を受けとり、それを変更して返す関数だと考えることができる。これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。マクロは通常の で記述され、任意の オペレータ（あるいは自作のオペレータ）を使うことができる。
上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために　 によって提供されているものである。
のマクロには、マクロ展開されたコードに、呼び出し側の文脈で使われているシンボルが出現する変数キャプチャという機能がある。これは、プログラマが特殊な意味をもつシンボルを備えたマクロを作ることを可能とする。
変数キャプチャは予期しない、一風変わったエラーを引き起こす可能性がある。 のような他の 系のシステムでは、変数キャプチャを許さないマクロ構文を備えているものもある。 では、意図しないキャプチャを避けるために、キャプチャの恐れのないマクロ展開時にユニークな変数を導入する codice_28 オペレータを使って回避するのが一般的である。
その他の問題として、不用意なマクロ展開時のオペレータのシャドウイングがある。たとえば、次のような (不正な) コードである。
codice_27 マクロは codice_30 の呼び出しへと展開される事になる。この時、意図しているのは組み込みのマクロ codice_30 であるが、このコンテキストでは codice_30 はまったく異なる意味を持つことになる。
と最も頻繁に比較対照されるのが である — これら二つは最も有名な 系言語だからだ。 は よりも古く、同じ の伝統から生みだされただけでなく、同じエンジニアのガイ・スティール・ジュニアが 委員会の議長を務めた。
以前の多くのLispの方言や実装とは異なり、Common Lisp は Scheme と同様な、スコープは静的スコープのみを基本とする仕様である。
ZetaLisp や Franz Lisp といった Common Lisp の設計に寄与した実装の多くは、インタプリタでは動的スコープを、コンパイラでは静的スコープ、という仕様になっていた。Schemeはそういったものとは異なり、静的スコープのみであった。Common Lisp は動的スコープをもサポートしているが、明示的な codice_35 宣言が必要である。ANSI Common Lisp のインタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。
時々、 は「」、 は「」と呼ばれることがある。これは が関数名と変数名(2つ)にそれぞれ独立した名前を備えている事に起因した名前である。しかし、実際には は codice_36 タグやブロック名、codice_37 キーワードなど多くの名前空間を持っているし、マクロをうまく使えば、構文的に名前空間を追加することも出来る。複数の名前空間に関するトレードオフについて、 と のそれぞれを支持する論争が長いあいだ行われている。 では変数名と関数名の衝突を避ける必要があるため、 の関数はよく codice_38 や codice_39、codice_40 といった関数名と衝突しないような引数名を取ることになる。一方 では引数として使う場合に、明示的に関数の名前空間を参照する必要がある。これは上にでてきた codice_11 のサンプルのように一般的なことである。
は 言語のように唯一の実装による規定されるものではなく、 やC言語のように仕様によって規定されている。
さらに、実装は標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。そのような追加機能をポータブルに利用可能とする フリーソフトウェア ライブラリが作成されている。最も顕著なものが、codice_52 や  プロジェクトである。
通常のUnix系 X86コンピュータ、サーバで頻繁に用いられる実装は以下である。次に、上の2つとは異なるものの、アクティブに改良が続けられており、また独特の性質をもった特筆すべき実装として、次のECLおよびABCLを挙げる。以下に示すのは、比較的マイナーな処理系である。
開発の頻度が落ちている、そこまで人気ではないなどの点はあるが、安定していて枯れた実装であるとも言える。