Common Lisp

（コモン・リスプ）は、コンピュータ・プログラミング言語 Lispの標準（の、ひとつ）であり、Lisp方言のひとつでもある。Common Lispの略称はCL。規格はANSIによる ANSI INCITS 226-1994 (S2018)。仕様を指すこともあれば、実装を指すこともある。いくつかの、自由ソフトウェアの定義に合致したライセンスによりライセンスされている実装や、オープンソースの定義に合致したライセンスによりライセンスされている実装や、プロプライエタリなライセンスによりライセンスされている実装がある。

Lispの基本的な特徴の他、いくつかのプログラミングパラダイムのLispへの取り込みについて標準を提供しているという、マルチパラダイムプログラミング言語という面がある。

関数型だけでなく、手続き型的な言語要素に関しても標準化している。
関数単位の細かで反復的なコンパイルにより、効率的な実行を可能にすると同時にREPLによる動的で迅速な開発をサポートする。
関数オブジェクト、複素数、有理数、多倍長整数などを一級オブジェクトとして持つ。
すべてはオブジェクト。マルチメソッド機能をサポートした強力な動的オブジェクトシステムCommon Lisp Object Systemを備える。
assert関数による基本的なテスト駆動開発が可能。
「例外/ハンドラ」の処理をさらに一段階分離した「Condition/Restart/Handler」による例外処理。
マクロ（プログラムによるコンパイル時のコード変換）やリーダーマクロ（特定の文字に対して新しく構文を拡張する）といった標準機能により言語を拡張可能。

構文
一般的なLispと同様のS式による構文である。

意味

 評価順 
評価順は、非常に単純な「左から右」、「内側から外側」モデルである（「左から右」を標準で決めているという点は特徴と言えるかもしれない（プログラミング言語の他の標準では決められていないものも多い））。

(F A1 A2) のようなS式で、Fが関数ならば、その引数 A1、A2 を左から右へ順番に評価し、最後にFにその引数を渡す。Fがマクロならば、まずマクロを展開する。

;; 2 と 2 を足す
(+ 2 2)
→ 4

;; 与えられた数を二乗する関数を定義
(defun square (x) 
 (* x x))

;; 関数を実行
(square 3)
→ 9

 静的スコープ 

以前の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 は、大雑把には、引数を取ることのことができる型である。例えば、(array fixnum (5 * 7))は、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。

Compound Typeでは、本来の型に合わせて、特定の一変数関数を型判定に用いることもできる。例えば、型 mod3 を以下のように定義できる。

(defun mod3 (n)
 (= (/ n 3) 0))

(deftype mod3 ()
 `(and fixnum (satisfies mod3)))

しかし、Common LispにはHaskellにおけるような型変数の概念はない。上のarrayの例における引数は、変数ではなく定数として処理されるためである。

 アトム ATOM 
Common Lispにおけるアトムとは、誤解を恐れず簡単に言うとlispにおいて「括弧によって囲まれないアトム」すべてを指す。数値はアトムである。シンボル、文字列、文字もアトムである。ANSI CLでは、Compound type (not cons)として定義されている。

数値 (type NUMBER)
様々な型がある。

 NUMBER
 COMPLEX
 REAL
 FLOAT
 SINGLE-FLOAT
 DOUBLE-FLOAT
 RATIONAL
 INTEGER
 SIGNED-BYTE
 UNSIGNED-BYTE
 FIXNUM
 BIGNUM
 RATIO

 は数値表現に 多倍長整数 を用いて任意のサイズと精度を実現している。有理数型が分数として正確に表現されるという点は、他の言語にあまり見られない特徴である。 は自動的にそれぞれの数値型を適切に変換する。

 文字 
 の文字型(char)は、文字の範囲に限定されない。これは が 以前からあった事を考えれば驚くようなことではない。いくつかの最近の処理系は 文字をサポートしている。文字列は、下で述べるシーケンスのsubtypeである。

 シンボル 
シンボル型は 言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは値セルと関数セルが最も重要なものである。シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。例えば、キーワードパッケージ中のシンボルはすべて自己評価シンボルである。 における真偽値は、自己評価シンボル t と nil によって表現される。 はパッケージと呼ばれるシンボルのための名前空間を備えている。

データ構造

 シーケンス 
 におけるシーケンス型は、リスト、ベクタ、ビットベクタ、文字列からなる。mapやreduceなどの多くの操作は、任意のシーケンス型に対して動作する。

他の 系の言語と同様、 のリストはコンス（コンスセル、ペアとも呼ばれる）で構成される。コンスセルはcarとcdrの二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。それぞれのコンスセルの car スロットはリストの要素（他のリストである可能性もある）を参照し、cdr スロットは次のコンスセルを参照する。ただし、最後のコンスセルの cdr だけは nil を参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。

 配列 

 は多次元の 配列をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。多次元配列は行列演算に利用される。ベクタは一次元の配列である。配列は任意の型を要素として持つことができる（一つの配列に複数の型の要素を混在させることもできる）が、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。型指定された配列のなかで二種類が標準で定義されている。文字列は文字を要素としたベクタであり、ビットのベクタはビットベクタである。

ビットベクタとベクタはシーケンスのsubtypeでもある。