Common Lisp
Common Lisp | |
---|---|
パラダイム | マルチパラダイム: 手続き型、関数型、オブジェクト指向、メタ |
登場時期 | 1984年、1994年にANSIにより標準化 |
開発者 | ANSI X3J13委員会 |
型付け | 強い動的型付け |
主な処理系 | Allegro Common Lisp、ABCL、CLISP、Clozure Common Lisp、CMU Common Lisp、Corman Common Lisp、Embeddable Common Lisp、GNU Common Lisp、LispWorks、Movitz、Scieneer Common Lisp、Steel Bank Common Lisp、Symbolics Common Lisp |
方言 | CLtL1、CLtL2、ANSI Common Lisp |
影響を受けた言語 | LISP、Lisp Machine Lisp、Maclisp、Scheme、Interlisp |
影響を与えた言語 | Clojure、Dylan、Eulisp、ISLISP、SKILL、newLISP、PicoLisp、Stella、SubL |
プラットフォーム | クロスプラットフォーム |
関連言語 | LISP |
Common Lisp(コモン・リスプ)は、コンピュータ・プログラミング言語 Lispの標準(の、ひとつ)であり、Lisp方言のひとつである。Common Lispの略称はCL(ごくまれにclispとも。なおCLISPという実装が実在するので混同回避のためあまり用いられない)。規格はANSIによる ANSI INCITS X3.226-1994 (R2004) 。仕様を指すこともあれば、実装を指すこともある。いくつかの、フリーソフトウェアの定義に合致したライセンスによりライセンスされている実装や、オープンソースの定義に合致したライセンスによりライセンスされている実装や、プロプライエタリなライセンスによりライセンスされている実装がある。
Lispの基本的な特徴の他、いくつかのプログラミングパラダイムのLispへの取り込みについて標準を提供しているという、マルチパラダイムプログラミング言語という面がある。
- 関数型だけでなく、progなど手続き型的な言語要素に関しても標準化している
- 関数単位の細かで反復的なコンパイルにより、効率的な実行を可能にすると同時にREPLによる動的で迅速な開発をサポートする
- 関数オブジェクト、複素数、有理数、Bignumなどを一級オブジェクトとして持つ
- すべてはオブジェクト。マルチメソッド機能をサポートした強力な動的オブジェクトシステムCommon Lisp Object Systemを備える
- assert関数による基本的なテスト駆動開発が可能
- 「例外/ハンドラ」の処理をさらに一段階分離した「Condition/Restart/Handler」による例外処理
- マクロ(プログラムによるコンパイル時のコード変換)やリーダーマクロ(特定の文字に対して新しく構文を拡張する)といった標準機能により言語を拡張可能
Contents
構文
一般的な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は、どのオブジェクトもそのインスタンスにならない型である。[1]
型にはbuilt-inな型とそうでないものがある。built-inな型は、整数、浮動小数、複素数、文字等といった(他の言語で言う)プリミティブな型に、配列やストリームなど組み込みの型を合わせたものである。built-inでない型には、構造体、クラスなどがある。このように、型システムはクラスおよびオブジェクトシステムと連続的に融合されている。
型は type specifierという記述方式で参照され、これはよくtypespecと省略される。typespecを用いて議論する上で、built-inとは直行する概念として、Atomic Type 対 Compound Typeという概念がある。Compound type は、大雑把には、引数を取ることのことができる型である。例えば、(array fixnum (5 * 7))
は、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。[2]
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)
として定義されている[3]。
数値 (type NUMBER)
様々な型がある。
- NUMBER
- COMPLEX
- REAL
- FLOAT
- SINGLE-FLOAT
- DOUBLE-FLOAT
- RATIONAL
- INTEGER
- SIGNED-BYTE
- UNSIGNED-BYTE
- FIXNUM
- BIGNUM
- INTEGER
- RATIO
- FLOAT
Common Lisp は数値表現に 多倍長整数 を用いて任意のサイズと精度を実現している。有理数型が分数として正確に表現されるという点は、他の言語にあまり見られない特徴である。Common Lisp は自動的にそれぞれの数値型を適切に変換する。
文字
Common Lisp の文字型(char)は、ASCII文字の範囲に限定されない。これは LISP が ASCII 以前からあった事を考えれば驚くようなことではない。いくつかの最近の処理系は Unicode 文字をサポートしている[4]文字列は、下で述べるシーケンスのsubtypeである。
シンボル
シンボル型は LISP 言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは値セル[5]と関数セル[6]が最も重要なものである。シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。例えば、キーワードパッケージ中のシンボルはすべて自己評価シンボルである。Common Lisp における真偽値は、自己評価シンボル t
と nil
によって表現される。Common Lisp はパッケージと呼ばれるシンボルのための名前空間を備えている。
データ構造
シーケンス
Common Lisp におけるシーケンス型は、リスト、ベクタ、ビットベクタ、文字列からなる。mapやreduceなどの多くの操作は、任意のシーケンス型に対して動作する。
他の LISP系の言語と同様、Common Lisp のリストはコンス[7]あるいはコンスセル[8]、ペア[9]で構成される。コンスセルは car
と cdr
の二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。それぞれのコンスセルの car
スロットはリストの要素(他のリストである可能性もある)を参照し、cdr
スロットは次のコンスセルを参照する。ただし、最後のコンスセルの cdr
だけは nil を参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。
配列
Common Lisp は多次元の 配列をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。多次元配列は行列演算に利用される。ベクタは一次元の配列である。配列は任意の型を要素として持つことができる(一つの配列に複数の型の要素を混在させることもできる)が、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。型指定された配列のなかで二種類が標準で定義されている。文字列は文字を要素としたベクタであり、ビットのベクタはビットベクタである。
ビットベクタとベクタはシーケンスのsubtypeでもある。
その他
ハッシュテーブルはデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように必要に応じて動的にリサイズされる。パッケージはシンボルの集合であり、主にプログラムの一部を 名前空間 で分割するために使用される。パッケージはいくつかのシンボルをエクスポート[10]することで、インターフェースを公開する。構造体 は C言語の構造体や Pascal のレコードに似た、複数の型と値のフィールド(スロットと呼ばれる)で構成される複合的なデータ構造である。クラスのインスタンス[11]は構造体に似ているが、これはオブジェクトシステム CLOS によって作られるものである。
関数
Common Lisp では、関数 もデータ型の一つである。たとえば、これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。これにより、非常に汎用化された操作を記述できるようになる。このため、Common Lisp のライブラリは、多くの部分が高階関数の上に成りたっている。たとえば、sort
関数は、引数として 比較オペレータ を取る。これは、比較関数が任意の型のデータを整列できるだけでなく、キーによって任意のデータ構造を整列することも可能にする。
(sort (list 5 2 6 3 1 4) #'>)
;「 > 関数」を比較オペレータとして用い、リストを整列する
; --> (6 5 4 3 2 1)
(sort (list '(9 a) '(3 b) '(4 c))
#'(lambda (x y) (< (car x) (car y))))
; リスト内のサブリスト中の最初の要素 (car) に沿ってリストを整列する
; --> ((3 b) (4 c) (9 a))
関数定義
defun
マクロは関数を定義する。関数定義は名前と、引数の名前、そして関数本体で構成される。
(defun square (x)
(* x x))
関数定義は、コンパイラに最適化設定や引数のデータ型を指定に関するヒントを与えるための 宣言[12]や、LISP システムに対話的なドキュメンテーションを与えるためのドキュメンテーション文字列[13]を含むことがある。
(defun square (x)
"Calculates the square of the number x."
(declare (number x) (optimize (speed 3) (debug 0) (safety 1)))
(* x x))
無名関数は lambda
式を用いて定義される。LISP 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。
関数の定義や操作に関する多くのオペレータが存在する。たとえば、関数は compile
によって再コンパイルされる場合がある。(いくつかの LISP システムでは、明示的なコンパイル命令があるまで、デフォルトでは関数をインタプリタで実行するものや、オンザフライで関数を実行するたびにコンパイルするものなどがある)
総称関数とメソッドの定義
defgeneric
マクロは、総称関数(ジェネリック関数)を定義する。defmethod
マクロはメソッドを定義する。総称関数はメソッドの集合である。メソッドはそのパラメータとして渡されたクラスやオブジェクトによって特定化される。総称関数が呼び出されると、マルチメソッドディスパッチ(多重メソッドディスパッチ)により、実際に使用されるメソッドが決定される。
(defgeneric add (a b))
(defmethod add ((a number) (b number))
(+ a b))
(defmethod add ((a string) (b string))
(concatenate 'string a b))
(add "Zippy" "Pinhead") ; returns "ZippyPinhead"
(add 2 3) ; returns 5
総称関数もファーストクラスのデータ型である。 総称関数やメソッドには上に記載したよりも、もっと豊富な機能が存在する。
関数名前空間
関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは Common Lisp と Scheme における主要な違いである。defun
、flet
そして labels
のようなオペレータは関数名前空間へ名前を定義する。
他の関数への引数として関数名を渡す場合には、function
スペシャルオペレータ(通常 #'
と略記される)を使う必要がある。最初の sort
引数では、関数名前空間にシンボル >
で定義された関数名を #'>
というコードで参照している。
Scheme の評価モデルはより単純で、単一の名前空間のみが存在し、引数部分だけでなくあらゆる位置で、評価順序を問わずフォームは評価される。この事が Common Lisp と Scheme のどちらかの方言で書かれたコードは、ときどき他方の経験を持つプログラマーを混乱させることになる。たとえば、Common Lisp プログラマーの多くは list
あるいは string
といった説明的な変数名を使用する事を好むが、これらの名称は Scheme ではローカルに関数名を上書きしてしまうという問題を起こすことになる。
関数に独立した名前空間を持つ事が利点かどうかは、LISP コミュニティにおける論争の源となっている。この論争は一般に「Lisp-1 vs. Lisp-2 の議論」と言われる。この用語は リチャード・ガブリエル と ケント・ピットマン らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた[14]。
その他の型
Common Lisp が備えている他の型は以下の通り:
- パス名 は ファイルシステム におけるファイルやディレクトリを表現する。Common Lisp のパス名機能は、ほとんどのオペレーティングシステムのファイル命名規則より一般的なものであり、プログラムが様々なシステムを通してポータブルにファイルにアクセスする事を可能としている。
- 入出力ストリームは、端末や開かれているファイルのような、バイナリデータ、テキストデータの入力元と出力先を表現する。
- Common Lisp は組込みの 擬似乱数生成器(PRNG)を備えている。ランダムな状態オブジェクトは擬似乱数のソースとして再利用可能であり、ユーザーが乱数の種を与える事や、同じ数列を再生する事を許可している。
- コンディション[15]はエラーや例外、その他のプログラムが反応する可能性がある有意なイベントを表現するための型である。
- クラス[16]は第一級のオブジェクトである。そして、それ自身がメタクラス[17]と呼ばれるクラスのインスタンスである。
スコープ
他のプログラミング言語におけるプログラムと同様に、Common Lisp のプログラムも変数や関数、その他の要素を参照するために名前を用いる。名前が参照するものは、スコープによって決定されている。
名前と、それが参照する実体との関係を束縛(バインディング[18])と呼ばれている。
マクロ
LISP系言語におけるマクロは、表面上は関数と同じように使われる。しかし、それは評価される式を表すというよりプログラムのソースコードの変形を表現している。
マクロはプログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは Perl のような言語で馴染みのある until
ループのためのフォームを実現する。
(defmacro until (test &body body)
`(do ()
(,test)
,@body))
;; example
(until (= (random 10) 0)
(write-line "Hello"))
(macroexpand-1 '(until (= (random 10) 0)
(write-line "Hello")))
;; -->
;; '(do ()
;; ((= (random 10) 0))
;; (write-line "Hello"))
すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。マクロは抽象構文木(S 式)を受けとり、それを変更して返す関数だと考えることができる。これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。マクロは通常の Common Lisp で記述され、任意の Common Lisp オペレータ(あるいは自作のオペレータ)を使うことができる。 上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために Common Lisp によって提供されているものである。
変数のキャプチャとシャドウイング
Common Lisp のマクロには、マクロ展開されたコードに、呼び出し側の文脈で使われているシンボルが出現する変数キャプチャという機能がある。これは、プログラマが特殊な意味をもつシンボルを備えたマクロを作ることを可能とする。
変数キャプチャは予期しない、一風変わったエラーを引き起こす可能性がある。Scheme のような他の LISP系のシステムでは、変数キャプチャを許さないマクロ構文[19]を備えているものもある。Common Lisp では、意図しないキャプチャを避けるために、キャプチャの恐れのないマクロ展開時にユニークな変数を導入する gensym
オペレータを使って回避するのが一般的である。
その他の問題として、不用意なマクロ展開時のオペレータのシャドウイングがある。たとえば、次のような (不正な) コードである。
(macrolet ((do (...) ... something else ...))
(until (= (random 10) 0)
(write-line "Hello")))
until
マクロは do
の呼び出しへと展開される事になる。この時、意図しているのは組み込みのマクロ do
であるが、このコンテキストでは do
はまったく異なる意味を持つことになる。
Common Lisp では、do
のような組み込みオペレータの再定義を禁止することで、オペレータのシャドウイング問題を和らげようとしている。さらに、ユーザーはそれぞれ自分のコードをパッケージに分離する事ができる。組み込みのシンボルは、ユーザーパッケージ内でシャドウイングされてしまっていても、COMMON-LISP
パッケージで見つけることができる。
Common Lisp Object System
Common Lisp は オブジェクト指向プログラミング のための道具として、Common Lisp Object System(CLOS)を備えている。これは、現在利用可能な言語の中で、もっとも強力なオブジェクトシステムの一つである。元々アドオン機能として提案された CLOS は、Common Lisp の ANSI 標準規格の一部として採用された。CLOS は 動的オブジェクトシステムであり、C++ や Java のような静的な言語のオブジェクト指向機能とは根本的に異なったものである。
他の LISP 系言語との比較
Common Lisp と最も頻繁に比較対照されるのが Scheme である — これら二つは最も有名な LISP系言語だからだ。Scheme は Common Lisp よりも古く、同じ LISP の伝統から生みだされただけでなく、同じエンジニアのガイ・スティール・ジュニア[20]が Common Lisp 委員会の議長を務めた。
以前の多くのLispの方言や実装とは異なり、Common Lisp は Scheme と同様な、スコープは静的スコープのみを基本とする仕様である。
ZetaLisp や Franz Lisp といった Common Lisp の設計に寄与した実装の多くは、インタプリタでは動的スコープを、コンパイラでは静的スコープ、という仕様になっていた。Schemeはそういったものとは異なり、静的スコープのみであった。Common Lisp は動的スコープをもサポートしているが、明示的な special
宣言が必要である。ANSI Common Lisp のインタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。
時々、Common Lisp は「Lisp-2」、Scheme は「Lisp-1」と呼ばれることがある。これは Common Lisp が関数名と変数名(2つ)にそれぞれ独立した名前を備えている事に起因した名前である。しかし、実際には Common Lisp は go
タグやブロック名、loop
キーワードなど多くの名前空間を持っているし、マクロをうまく使えば、構文的に名前空間を追加することも出来る。複数の名前空間に関するトレードオフについて、Common Lisp と Scheme のそれぞれを支持する論争が長いあいだ行われている。Scheme では変数名と関数名の衝突を避ける必要があるため、Scheme の関数はよく lis
や lst
、lyst
といった関数名と衝突しないような引数名を取ることになる。一方 Common Lisp では引数として使う場合に、明示的に関数の名前空間を参照する必要がある。これは上にでてきた sort
のサンプルのように一般的なことである。
Common Lisp はまた、真偽値の扱いが Scheme とは異なっている。Scheme は真と偽の表現として #t
と #f
という特別な値を用いている。Common Lisp は、より古い LISP系言語の伝統に従ってシンボルの t
と nil
[21]を使っている。Common Lisp においては、if
のような条件式において任意の nil
でない値が真として扱われる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。
Scheme の標準規格は 末尾再帰の最適化 を要求しているが、Common Lisp の規格はしていない。ほとんどの Common Lisp 実装は末尾再帰の最適化を提供するが、それでもプログラマーが最適化宣言を使った場合のみである場合が多い。それにも関わらず、一般的な Common Lisp のコーディングスタイルは Scheme スタイルで好まれるようなあらゆる場合に再帰を使うというやり方とは異なっている。Scheme プログラマが末尾再帰で表現するものを、Common Lisp プログラマーは do
、dolist
、loop
、最近だと iterate
パッケージを使って反復で表現する。
実装
Common Lisp は Perl言語のように唯一の実装による規定されるものではなく、Ada やC言語のように仕様によって規定されている。
さらに、実装は標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。そのような追加機能をポータブルに利用可能とする フリーソフトウェア ライブラリが作成されている。最も顕著なものが、Common-Lisp.net
や Common Lisp Open Code Collection プロジェクトである。
Common Lisp はインクリメンタルなコンパイラとして実装されるように設計された。関数のインライン展開のような最適化コンパイルのための標準的な宣言が言語規格に提案されている。ほとんどの Common Lisp 実装は関数を機械語へとコンパイルし、Lispの環境を含めたコアダンプとして出力する。その他のコンパイラは、性能では劣るが、移植性に勝る バイトコード へとコンパイルする。LISP系の言語はインタプリタ型言語であるという誤解は、そのほとんどが Common Lisp 環境がインタラクティブなプロンプトを提供し、関数をその都度コンパイルするということに起因している。
CLISP のような、UNIX 上で動くいくつかの実装は、システムが Perl やUNIXシェルインタプリタを透過的に呼び出すのと同様に スクリプトのインタプリタ[22]として使うことができる。
実装系
再配布可能な実装の一覧
通常のUnix系 X86コンピュータ、サーバで頻繁に用いられる実装は以下である。
- Steel Bank Common Lisp (SBCL)
- 後述のCMUCL から分岐して保守性を大幅に強化した処理系[23]であり、現在通常のx86コンピュータで最も使用されている実装の一つ。SBCL は、REPLから入力された評価式であっても、インタプリタを介さず全てネイティブコードにコンパイルしてから実行する[24]。CMUCL譲りのコンパイラにより非常に強力な最適化を行うことが出来、生成するコードはC言語のコードを上回ることもある。SBCL は、CMUCL が動作するプラットフォームに加えて、Linux(PowerPC、SPARC、MIPS)、Mac OS X、Microsoft Windows 上でも動作する。ただし、HP-UX 上では動作しない。
- Clozure CL
- フリー な処理系であり、SBCLと並んで、あるいはそれ以上に使用されている実装でもある。「Coral Common Lisp」 「Macintosh Allegro Common Lisp」 「Macintosh Common Lisp」 「OpenMCL」 という複数の改名を経てオープンソース化された[25]。その歴史のため、Mac OS の Cocoa API との連携(実装による独自機能)に強みをもつほか、ファイルの遅延ローディング、(SBCLと比べたときの)デバッグメッセージのわかりやすさなどの特色を持つ。今は Mac OS X、Darwin、Linux(PowerPC、Intel x86-64)に移植されている。Intel x86-32 や 64ビット版の Windows への移植も進行中。[26]
次に、上の2つとは異なるものの、アクティブに改良が続けられており、また独特の性質をもった特筆すべき実装として、次のECLおよびABCLを挙げる。
- Embeddable Common Lisp (ECL)
- 後述のGCLから派生した、C言語で作成されたプログラムに組み込むために設計された処理系である。lispコードはCのコードに変換された上でコンパイル実行されるので、最低限のCコンパイラしか提供されていない組み込み機器などの環境でも、クロスコンパイルにより利用することが出来る。また、C言語の高速性も受け継いでいる。
- Armed Bear Common Lisp
- Java仮想マシン上で動作する実装である。同マシンのJavaバイトコードへのコンパイラを備えており、Common Lisp プログラムから Java のライブラリにアクセスする事が可能。この実装系は Armed Bear J Editor のコンポーネントであるが、単独で利用する事もできる。[27]近年もアクティブに開発されている。
以下に示すのは、比較的マイナーな処理系である。 開発の頻度が落ちている、そこまで人気ではないなどの点はあるが、安定していて枯れた実装であるとも言える。
- CMU Common Lisp (CMUCL)
- カーネギーメロン大学 で開発された実装を起源とする。現在はボランティアグループによりメンテナンスされる。Pythonと呼ばれる(プログラミング言語の Python とは関連なし)高速なネイティブコードコンパイラの起源となった実装である。Intel x86 上の Linux や BSD、Alpha 上の Linux、Solaris、IRIX、HP-UX、PowerPCを含むMac OS Xなどで動作する。
- CLISP
- バイトコードコンパイラを備えた実装である。移植性に富み、多くの UNIX や、Mac OS X などの UNIXに類似したシステム、および Microsoft Windows、その他のオペレーティングシステムで動作する。
- GNU Common Lisp (GCL)
- Kyoto Common Lisp から発展したGNUプロジェクトの製品である。完全な ANSI 準拠ではないが、数学ツールの Maxima や AXIOM、ACL2 などを含むいくつかの大規模なプロジェクトで採用されている。この処理系は 11 の異なるアーキテクチャ上の Linux で動作し、Windows や Solaris、FreeBSD でも動作する。開発は続いているが、頻度が落ちている。[28]
- Macintosh Common Lisp
- デジタルツール社[29]製の実装系である。MCL 5.2 からオープンソース化された。PowerPC 上の Mac OS X で動作する。.
- Movitz
- x86 アーキテクチャ用の実装系であり、オペレーティングシステムに依存しない。
- Poplog
- Common Lisp を備えたバージョンが存在する。POP-11 は Common Lisp と Prolog、Standard ML を備えており、複数の言語を混在させたプログラミングが可能である。また、全ての言語が逐次的にコンパイルされる。コンパイラと通信する Emacs に類似のエディタが統合されている。
- Jatha
- Common Lisp の大半をサブセットとして実装した Java のライブラリである。[30]
商用の実装
- Allegro Common Lisp
- Franz(フランツ)[31]による実装系。
- LispWorks
- リスプワークス[32]による実装系。
- Corman Lisp
- コーマン・テクノロジーズ[33]による実装系。
- Scieneer Common Lisp
- サイエニア[34]による実装系。
著名なアプリケーション
政府機関、非営利団体での利用
- SPIKE
- ハッブル宇宙望遠鏡 運用管理のためのプランニング・スケジューリングシステム。[35] 角度変更や、指定地点の撮影などのさまざまな指令を、燃料や希望時間帯など多様かつ複雑な制約のもとで、最適にスケジューリングする。
- Remote Agent (remote intelligent self-repair software, RAX)
- NASA Deep Space 1 に搭載された、自己修復・監視用人工知能。NASA Ames Research Center および NASA JPLによって開発された。人間の監視なしで探索機を航行させるための自律エージェント。多数のコンポーネントからなるが、その主要な3つは、EUROPA(マーズ・エクスプロレーション・ローバー のためのプランニングシステム)、EXEC(プラン実行システム)、Livingstone(モデルベース異常診断システム)である。1999年度の NASA ソフトウェア・オブ・ジ・イアー賞を受賞した。[36]
商用
- Yahoo! ストア
- en:Viawebにより作成され、後にYahoo!に買収された。誰でも簡単に使えるウェブストア作成サービスを提供し、顧客の作ったウェブサイトで他のユーザが買い物をするという、史上初めてのアプリケーションサービスプロバイダである。後に C++ と Perl で書き直された(と発表された)。ポール・グレアムによればその実態は「C++でLispインタプリタを書いた」というようなものだった、という[37]。
- ジャック×ダクスター,クラッシュ・バンディクー等
- ノーティードッグによるPlaystation、Playstation2 用のビデオゲーム。クラッシュ・バンディクーはGOOL(Game Oriented Object Lisp)[38]、ジャック×ダクスターはGOOLを機能的に拡張した全く別の言語Game Oriented Assembly Lispによって実装されている。これらは、プレイステーションらの特殊なプロセッサ事情に合わせた自作コンパイラを含んでいる。
- D-Wave 1 量子計算機
- D-Wave Systems による量子計算機(正しくは断熱量子アニーリング専用ハードウェア)。ホストOSがCommon Lispで作成されている[39]。ただし、利用者向けのインターフェースはPython APIである。求人ページにおいても、Common Lisp(あるいは他の関数型言語)のプログラミング経験を求人要件としてあげている[40]。
- Orbitz
- en:ITA Softwareによって開発された、有名な旅行予約サイト。ITA Software は2011年に Google に買収され、一部門となっている[41]。旅行予約には、莫大な数の可能な経路の中から高速に最短・最安の路線を選択する知的探索アルゴリズムが必要であり、そのためにLispが用いられている。
- Mirai
- イズウェア社[42]の製品で、統合された 2D/3D コンピュータグラフィックス作成環境である。ポリゴンモデラー、先進的な IK/FK ノンリニアアニメーションシステム、2D/3D ペインティングなどを備えていた。動画やビデオゲーム、軍事シミュレーションの世界では有名である。[43]
- Piano
- 飛行機のスケジュール設計や競合との比較のためのシステム。[44]
- Xanalys
- 警察によって使われている世界的なセキュリティや詐欺防止サービスのための原因調査用ソフトウェア。[45]
- ICAD
- ナレッジ・テクノロジーズ・インターナショナル社製の機械設計ソフトウェア。
- General-purpose Declarative Language
- ジェンワークス・インターナショナル社[46]の製品。ウェブベースのエンジニアリング、デザイン、ビジネスアプリケーション作成用開発ツールである
- Igor Engraver
- 音楽記譜用プログラム。[47]
オープンソース
- Maxima
- 代数的数式処理エキスパートシステム。GPL で公開されており、自由に入手することができる。一言で言えば、義務教育レベルの二次方程式から、大学学部レベルの常微分方程式に至るまで、方程式を数学の知識を駆使して式変形し、自動で答えを求めてくれる。Richard Fateman教授によって作成されたMacsymaの、Common Lisp 上の再実装である。
- ACL2
- 定理証明用のシステム
- Compo
- 複雑な音楽構造を自然なやり方で表現する事を可能とした言語。[48]
- Lisa
- 知的エージェント作成のためのルールベースのプロダクションシステム。[49]
脚注
- ↑ 一方で型nullは、オブジェクトNILを表す型である。
- ↑ このようなtypespecは、配列の型arrayのvalid type specifierである
- ↑ http://clhs.lisp.se/Body/t_atom.htm
- ↑ CLiki : Unicode support
- ↑ 英: value cell
- ↑ 英: function cell
- ↑ 英: cons
- ↑ 英: cons cell
- ↑ 英: pair
- ↑ 英: export
- ↑ 英: instance
- ↑ 英: declaration
- ↑ 英: docstring
- ↑ Technical Issues of Separation in Function Cells and Value Cells
- ↑ 英: condition
- ↑ 英: class
- ↑ 英: metaclass
- ↑ 英: binding
- ↑ 「健全な(もしくは衛生的な)マクロ」と呼ばれる。
- ↑ 彼は ジェラルド・J・サスマンとともに Scheme を設計した。
- ↑
nil
はまた、空リストをも表現する。 - ↑ http://clisp.cons.org/impnotes/quickstart.html#quickstart-unix
- ↑ http://sbcl.sourceforge.net/history.html
- ↑ 最近、インタプリタのサポートも試験的に実装されている。
- ↑ http://ccl.clozure.com/history.html
- ↑ http://trac.clozure.com/openmcl
- ↑ http://armedbear.org/abcl.html
- ↑ http://www.gnu.org/software/gcl/
- ↑ http://www.digitool.com/
- ↑ http://jatha.sourceforge.net/
- ↑ http://www.franz.com/
- ↑ http://www.lispworks.com/
- ↑ http://www.cormanlisp.com/
- ↑ http://www.scieneer.com/
- ↑ http://www.stsci.edu/resources/software_hardware/spike/
- ↑ http://ic.arc.nasa.gov/projects/remote-agent/
- ↑ 「2003 年 1 月、ヤフーは新しいバージョンの、C++ と Perl で書かれたエディタ(訳注: Viawebのシステムのうち、Lispで書かれていた、サイトを構築するシステムの部分)をリリースした。それは『もはやプログラムは Lisp で書かれていない』というよりも『プログラムを C++ に変換するために Lisp インタプリタを書いた』というようなものであった。私の知る限り、すべてのページ生成テンプレートのソースファイルは依然として Lisp コードのままだった(「グリーンスパンの第10法則」を見よ)。」、ポール・グレアム、Beating the Averages
- ↑ http://all-things-andy-gavin.com/2011/03/12/making-crash-bandicoot-gool-part-9/
- ↑ ページ下部,開発者のコメント http://dwave.wordpress.com/2011/05/20/learning-to-program-the-d-wave-one-software-you-should-install-a-book-you-should-buy/
- ↑ http://www.dwavesys.com/careers/senior-software-developer
- ↑ http://www.itasoftware.com/about/index.html
- ↑ http://www.izware.com/
- ↑ http://www.izware.com/mirai/
- ↑ http://www.piano.aero/
- ↑ http://www.xanalys.com/
- ↑ http://www.genworks.com/
- ↑ http://www.noteheads.com/
- ↑ http://compo.sourceforge.net/
- ↑ http://lisa.sourceforge.net/
参考文献
- Common Lisp HyperSpec
- 『LISP 原書第3版 I』 著者:P.H. ウィンストン、B.K.P. ホーン 訳:白井 良明、井田 昌之、安部 憲広 - ISBN 4563014648
- 『LISP 原書第3版 II』 著者:P.H. ウィンストン、B.K.P. ホーン 訳:白井 良明、井田 昌之、安部 憲広 - ISBN 4563014656
- 『Common Lisp 入門』 著者:湯浅 太一、萩谷 昌己 - ISBN 978-4000076852
- 『COMMON LISP - COMMON LISP 言語仕様書』 著者:Guy L. Steele Jr. 共立出版 - COMMON LISP の第1版 - ISBN 4320022718
- 『COMMON LISP 第2版』 著者:ガイ・スティール・ジュニア、井田 昌之 共立出版 - ANSI Common Lisp 以前の Common Lisp 規格書 CLtL2 - ISBN 4320025881
- 『ANSI Common Lisp』 著者:ポール・グレアム、訳:久野 雅樹,須賀 哲夫 - ANSI Common Lisp を使ったプログラミングの解説書。付録Cに Common Lisp 第1版、第2版とそれ以降の変更点が掲載されている。 - ISBN 4894714337
- 『入門 Common Lisp — 関数型4つの特徴とλ(ラムダ)計算』 著者:新納 浩幸 - ISBN 4839920818
- 『[Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp』
- 『On Lisp』 著者:ポール・グレアム、訳:野田 開 - ISBN 978-4274066375
- 『実践 Common Lisp』 ペーター・ザイベル著、佐野匡俊・水丸淳・園城雅之・金子祐介 共訳 - ISBN 978-4274067211
外部リンク
- CLiki — Common Lisp に関するフリーソフトウェアについての掲示板
- Common Lisp software repository
- The Common Lisp directory — Common Lisp に関するすべての情報のリポジトリ
Computer-Books.us
ダウンロード可能な LISP の本の一覧- Lisping at JPL
- The Common Lisp Cookbook — 有用なプログラミング手法のコレクション
- The Nature of Lisp — XML との比較によるエッセイ
- Peter Norvig's page — Common Lisp に関する興味深いリソースを多数含んでいる
- On Lisp — 和訳版が訳者により公開されている。
入門書
- Lisp Primer — コリン・アレンとマネーシ・ダーガトによる解説
- Common Lisp: A Gentle Introduction to Symbolic Computation — 初心者向け、オンラインで利用可能
- Casting SPELs in Lisp — Common Lisp の導入向け漫画