LISPUSER

LISPMEMOLisp isn't a language, it's a building material. -- Alan Kay

(top)  (memo)  (rss)

Wikipedia の Common Lisp ページ向け原稿

On Lisp が発売されたとの事で、Lisp 界隈では喜びの声が多数あがっていますね。 なんか表紙もカッコよさそうです。うひょう。これで、Lisp に興味持つ人が増えるといいなぁ〜と、妄想しつつ。

日本の Lisp 界ですが、 Web でみる限り学校でやるのは Scheme がほとんどたと思うので Scheme 人気のほうが高いのはなんとなくわかるんですが、 日本では、別の入門ルートとして xyzzy で Lisp に触れる -> Lisp そのものに興味をもつ -> Lisp 大好き というのもありそうですよねー(私はこのルートです)。

で、ふと、Common Lisp のページ http://ja.wikipedia.org/wiki/Common_Lisp を参照したところ… ガガーン。Scheme のページより圧倒的に活気がないッ。こいつぁーまずい。 これでは Lisp に興味 -> Wikipedia -> Scheme へ転向という流れが目に浮ぶようだッ。

というわけで、大至急ある程度充実している Wikipeida 英語版を翻訳してみました。 原文は Lisp-2 vs Lisp-1、Scheme との違いなども抑えていて結構まとまっているかんじだし。

投稿前に見直しもかねてここに貼っておきます。ツッコミ歓迎です。

'''Common Lisp'''('''コモン・リスプ'''、通常 '''CL''' と略記される)は[[関数型プログラミング言語]]で
[[LISP]][[方言 (プログラミング言語)|方言]]の一種。ANSI X3.226-1994 で標準化されている。
それ以前の乱立した方言を標準化するために開発された。'''Common Lisp''' 自体は実装ではなく言語仕様である。
'''Common Lisp''' 標準に準拠した実装がいくつかの商用製品とオープンソースソフトウェアとして利用可能である。

'''Common Lisp''' はマルチパラダイムで汎用目的の言語である。

* 手続き型のプログラミング、関数型のプログラミング、オブジェクト指向プログラミングのパラダイムの組み合わをサポートしている
* 反復的なコンパイルで効率的な実行を可能としながら、動的言語であり迅速な開発をサポートする
* 強力な動的オブジェクトシステム CLOS を備える
* マクロ(プログラムによるコンパイル時のコード変換)やリーダーマクロ(特定の文字に対して新しく構文を拡張する)といった標準機能により言語を拡張可能

== 構文 ==

'''Common Lisp''' は '''Lisp''' 方言であり、コードとデータ構造の表現には [[S式]] を使う。関数やマクロ呼び出しはリストとして記述される。
関数名は、次に示す例のようにリストの先頭に位置する。

 (+ 2 2)           ; 2 と 2 を足して 4 を得る

 (setf p 3.1415)   ; 変数 '''p''' を 3.1415 に設定
   <!-- "pi" is a built-in constant; can't setf it-->
   
; 与えられた数を二乗する関数を定義
(defun square (x) 
   (* x x))

; 関数を実行
 (square 3)        ; 9 を返す

<!--                  I truncated this a bit; in smaller browsers, it runs off the side-->
 ; 構造化 - 変数は let ブロックの内側にのみ存在する。つまり、既存の変数を変更せずに、
 ; 任意の新しい値を導入できる。ブロックが終了すると古い変数が復帰される。
 (let ((a 6) (b 4)) 
   (+ a b)) ; returns 10

==データ型==

Common Lisp はたいていの言語より多くのデータ型を持っている。

===スカラー型===

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

Common Lisp の ''[[文字]]'' 型は、[[ASCII]] 範囲に限定されない -- これは Lisp が ASCII 以前からあった事を考えれば驚くような事ではない。
いくつかの最近の処理系は [[Unicode]] 文字をサポートしている。 [http://www.cliki.net/Unicode%20Support]

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

===データ構造===

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

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

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

''[[ハッシュテーブル]]'' はデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように
必要に応じて動的にリサイズされる。

''パッケージ'' はシンボルの集合であり、主にプログラムの一部を [[名前空間]] で分割するために使用される。
パッケージはいくつかのシンボルを ''エクスポート (export)'' することで、インターフェースを公開する。

''構造体'' は [[C]] の構造体や [[Pascal]] のレコードに似た、複数の型と値のフィールド(スロットと呼ばれる)で構成される複合的なデータ構造である。

クラスの ''インスタンス (instance)' は構造体に似ているが、これはオブジェクトシステム [[CLOS]] によって作られるものである。

===関数===

Common Lisp では、 ''関数'' もデータ型の一つである。
たとえば、これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。
これにより、非常に汎用化された操作を記述できるようになる。

Common Lisp のライブラリは、多くの部分が高階関数の上に成りたっている。たとえば、 <CODE>sort</CODE> 関数は、引数として [[比較オペレータ]] を取る。
これは、比較関数が任意の型のデータを整列できるだけでなく、キーによって任意のデータ構造を整列するも可能にする。

 (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)) が返る

The evaluation model for functions is very simple.  When the evaluator encounters a form <code>(F A1 A2...)</code> then it is to assume that the symbol named F is one of the following:

関数の評価モデルは非常に単純である。評価器が <code>(F A1 A2 ...)</code> のようなコードに出会うと、F というシンボルを次のうちのどれか一つであると仮定する:

# A special operator (easily checked against a fixed list)
# A macro operator (must have been defined previously)
# The name of a function (default), which may either be a symbol, or a sub-form beginning with the symbol <code>lambda</code>.

# スペシャルオペレータ (これはスペシャルオペレータのリストをチェックする事で簡単に判断できる)
# マクロオペレータ (事前にマクロとして定義されている必要がある)
# 関数名 (これはシンボルか、あるいはサブフォームが <code>lambda</code> シンボルで始まっている場合)

If F is the name of a function, then the arguments A1, A2, ..., An are evaluated in left-to-right order, and the function is found and invoked with those values supplied as parameters.  

もし F が関数名であったならば、 A1, A2, ... は引数となり左から右へ順番に評価される。そして、関数が見つかったならば、その関数呼び出しのパラメータとして使用される。

====関数定義====

<CODE>defun</CODE> マクロは関数を定義する。
関数定義は名前と、引数の名前、そして関数本体(body)で構成される。

 (defun square (x)
    (* x x))

Function definitions may include ''declarations'', which provide hints to the compiler about optimization settings or the data types of arguments. They may also include ''documentation strings'' (docstrings), which the Lisp system may use to provide interactive documentation:

関数定義は、コンパイラに最適化設定や引数のデータ型を指定に関するヒントを与えるための ''宣言 (declaration)'' や、
Lisp システムに対話的なドキュメンテーションを与えいるための ''ドキュメンテーション文字列 (docstring)'' を含むことがある。

 (defun square (x)
    <EM>(declare (number x) (optimize (speed 3) (debug 0) (safety 1)))
    "Calculates the square of the number x."</EM>
    (* x x))

無名関数は <CODE>lambda</CODE> 式を用いて定義される。 Lisp 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。

There are a number of other operators related to the definition and manipulation of functions. For instance, a function may be recompiled with the <CODE>compile</CODE> operator. (Some Lisp systems run functions in an interpreter by default unless instructed to compile; others compile every entered function on the fly.)

関数の定義や操作に関する多くのオペレータが存在する。たとえば、関数は <CODE>compile</CODE> によって再コンパイルされる場合がある。
(いくつかの Lisp システムでは、明示的なコンパイル命令があるまで、デフォルトでは関数をインタプリタで実行するものもや、オンザフライで関数を実行するたびにコンパイルするものなどがある)

====関数名前空間====

関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは Common Lisp と [[Scheme (programming language)|Scheme]] における主要な違いである。<code>defun</code>, <code>flet</code>, and <code>labels</code> のようなオペレータは関数名前空間へ名前を定義する。

他の関数への引数として関数名を渡す場合には、 <code>function</code> スペシャルオペレータ(通常 #' と略記される)を使う必要がある。
最初の <code>sort</code> 引数では、関数名前空間にシンボル <code>&gt;</code> で定義された関数名を <code>#'&gt;</code> というコードで参照している。

[[Scheme (programming language)|Scheme's]] の評価モデルはより単純で、単一の名前空間のみが存在し、引数部分だけでなくあらゆる位置で、評価順序を問わずフォームは評価される。この事が Common Lisp と Scheme のどちらかの方言で書かれたコードは、ときどき他方の経験を持つプログラマーを混乱させることになる。たとえば、
多くの CL プログラマーは ''list'' あるいは 'string' といった説明的な変数名を仕様する事を好むが、これらの名称は Scheme ではローカルに関数名を上書きしてしまうという問題を起こすことになる。

関数に独立した名前空間を持つ事が利点かどうかは、Lisp コミュニティにおける論争の源となている。この論争は一般に ''Lisp-1 vs. Lisp-2 の議論'' として参照される。この用語は [[Richard P. Gabriel]] と [[Kent Pitman]] らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた。 [http://www.nhplace.com/kent/Papers/Technical-Issues.html]

===その他の型===

Common Lisp が備えている他の型は以下の通り:

* ''Pathname'' は [[ファイルシステム]] におけるファイルやディレクトリを表現する。Common Lisp の Pathname 機能は、ほとんどのオペレーティングシステムのファイル命名規則より一般的なものであり、Lisp プログラムが様々なシステムを通してポータブルにファイルにアクセスする事を可能としている。
* 入出力 ''ストリーム'' は、端末やオープンされたファイルのような、バイナリデータ/テキストデータの入力元と出力先を表現する。
* Common lisp は組み込みの [[仮想乱数ジェネレータ]] (PRNG) を備えている。 ''ランダムな状態'' オブジェクトは仮想乱数のソースとして再利用可能であり、ユーザーが乱数の種を与える事や、同じ数列を再生する事を許可している。
* ''コンディション (Condition)'' はエラーや例外、その他のプログラムが反応する可能性がある "興味深い" イベントを表現するための型である。
* ''クラス (Class)'' は第一級のオブジェクトである。そして、それ自身が [[メタクラス]] (metaclass) と呼ばれるクラスのインスタンスである。

==マクロ==

Lisp における ''[[マクロ]]'' は、表面上は関数と同じように使われる。しかし、それは評価される式を表わすというよりプログラムのソースコードの変形を表現している。

マクロは Lisp プログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは [[Perl]] のような言語で馴染みのある <CODE>until</CODE> ループのためのフォームを実現する。

<pre>
 (defmacro until (test &body body)
   `(do ()
        (,test)
      ,@body))

 ;; example
 (until (= (random 10) 0) 
   (write-line "Hello"))
</pre>

すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。
マクロは抽象構文木(Lisp の S 式)を受けとり、それを変更して返す関数だと考えることができる。
これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。
マクロは通常の Common Lisp で記述され、任意の Common Lisp オペレータ(あるいは自作のオペレータ)を使うことができる
上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために Common Lisp によって提供されているものである。

====変数のキャプチャとシャドウイング====

Common Lisp のマクロには、マクロ展開されたコードに、呼び出し側の文脈で使われているシンボルが出現する ''変数キャプチャ'' という機能がある。
これは、プログラマーが特殊な意味をもつシンボルを備えたマクロを作ることを可能とする。

''変数キャプチャ'' は予期しない、一風変わったエラーを導入する可能性がある。Scheme のような他の Lisp システムでは、変数キャプチャを許さないマクロ構文 &mdash; "衛生的なマクロ (hygienic macro)" と呼ばれる &mdash; を備えているものもある。 Common Lisp では、意図しないキャプチャを避けるために、キャプチャの恐れのないマクロ展開事にユニークな変数を導入する [[gensym]] オペレータを使って回避するのが一般的である。

Another issue is the inadvertent ''shadowing of operators'' used in a macroexpansion. For example, consider the following (incorrect) code:

その他の問題として、不用意なマクロ展開時の ''オペレータのシャドウイング'' がある。たとえば、次のような (不正な) コードである。

 (macrolet ((do (...) ... something else ...))
    (until (= (random 10) 0) (write-line "Hello")))

<code>UNTIL</code> マクロは <code>DO</code> の呼び出しへと展開される事になる。この時、意図しているのは組み込みのマクロ <code>DO</code> であるが、このコンテキストでは <code>DO</code> はまったく異なる意味を持つことになる。

Common Lisp では、<code>DO</code> のような組み込みオペレータの再定義を禁止することで、オペレータのシャドウイング問題を柔らげようとしている。
さらに、ユーザーはそれぞれ自分のコードを ''パッケージ (package)'' に分離する事ができる。組み込みのシンボルは、ユーザーパッケージ内でシャドウイングされてしまっていても、<code>COMMON-LISP</code> パッケージで見つけることができる。

==Common Lisp Object System==

{{Main|Common Lisp Object System}}

Common Lisp は [[オブジェクト指向プログラミング]] のための道具として、 Common Lisp Object System ([[CLOS]]) を備えている。これは、現在利用可能な言語の中で、もっとも強力なオブジェクトシステムの一つである。元々アドオン機能として提案された CLOS は、Common Lisp の [[ANSI]] 標準規格の一部として採用された。
CLOS は [[dynamic programming language|動的]] オブジェクトシステムであり、[[C++]] や [[Java (programming language)|Java]] のような静的な言語の OOP 機能とは
根本的に異なってたものである。

==他の Lisp との比較==

<!-- まだまだ不足 -->

Common Lisp は最も頻繁に比較対照されるのが [[Scheme (programming language)|Scheme]] である &mdash; これら二つは最も有名な Lisp 方言であるからだ。
Scheme は CL よりも古く、同じ Lispの伝統から生みだされただけでなく、同じエンジニア [[Guy L. Steele, Jr.|Guy L. Steele]] (彼は [[Gerald Jay Sussman]] とともに Scheme を設計した) が Common Lisp 委員会の議長を務めた。

Common Lisp は汎用目的のプログラミング言語であり、組み込み言語である [[Emacs]] [[Emacs Lisp|Lisp]] や [[AutoLisp]] のような Lisp の変種とは対照的である。
それ以前の多くの Lisp とは異なり、 Common Lisp は [[Scheme (programming language)|Scheme]] と同様にレキシカルな変数スコープ [[scode (programming)|scode]] を採用している。

[[ZetaLisp]] や Franz Lisp といった Common Lisp の設計に寄与した Lisp システムの多くは、インタプリタ内ではダイナミックスコープを、コンパイラ内ではレキシカルスコープを使っていた。Scheme は Lisp に単一のレキシカルスコープを導入した。これは、 [[ALGOL 68]] から発想を得たものであり、広く良いアイデアであると認識されていた。 CL はダイナミックスコープをもサポートしてりうが、それには明示的な "special" 宣言が必要である。 ANSI CL のインタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。

時々、Common Lisp は ''Lisp-2'' 、Scheme は ''Lisp-1'' と呼ばれることがある。これは CL が関数名と変数名にそれぞれ独立した名前を備えている事に起因した名前である。しかし、実際には CL は go タグやブロック名、 <CODE>loop</CODE> キーワードなど ''多くの'' 名前空間を持っている。複数の名前空間に関するトレードオフについて、CL と Scheme のそれぞれを支持する論争が長いあいだ行なわれている。Scheme では変数名と関数名の衝突を避ける必要があるため、Scheme の関数はよく <CODE>lis</CODE> や <CODE>lst</CODE>、<CODE>lyst</CODE> といった関数名と衝突しないような引数名を取ることになる。一方 CL では引数として使う場合に、明示的に関数の名前空間を参照する必要がある -- これは上にでてきた <CODE>sort</CODE> のサンプルのように一般的な事である。

CL はまた、真偽値の扱いが Scheme とは異なっている。Scheme は真と偽の表現として #t と #f という特別な値を用いている。 CL は、より古い Lisp の伝統に従って
シンボルの T と NIL (NIL はまた、空リストをも表現する)を使っている。CL においては、 <CODE>if</CODE> のような条件式において ''任意の''  NIL でない値が真として扱かわれる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。

Lastly, the Scheme standards documents require [[tail recursion|tail-call optimization]], which the CL standard does not. Most CL implementations do offer tail-call optimization, although often only when the programmer uses an optimization directive. Nonetheless, common CL coding style does not favor the ubiquitous use of recursion that Scheme style prefers -- what a Scheme programmer would express with tail recursion, a CL user would usually express with an iterative expression in <CODE>do</CODE>, <CODE>dolist</CODE>, <CODE>loop</CODE>, or (more recently) with the <CODE>iterate</CODE> package.

最後に、Scheme の標準規格は [[tail recursion|末尾再帰の最適化]] を要求しているが、CL の規格はしてない。
ほとんどの CL 実装は末尾再帰の最適化を提供するが、それでもプログラマーが最適化宣言を使った場合のみである場合が多い。
それにも関わらず、一般的な CL のコーディングスタイルは Scheme スタイルで好まれるようなあらゆく場合に再帰を使うというやり方とは異なっている -- 
Scheme プログラマが末尾再帰で表現するものを、CL ユーザーは <CODE>do</CODE>, <CODE>dolist</CODE>, <CODE>loop</CODE>, 最近だと <CODE>iterate</CODE> パッケージを使って反復で表現する。

==実装==

Common Lisp は [[Perl]] のように唯一の実装による規定されるものではなく、[[Ada programming language|Ada]] や [[C (programming language)|C]]) のように仕様によって規定されている。

さらに、実装は標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。そのような追加機能をポータブルに利用可能とする [[Free Software|フリーソフトウェア]] ライブラリが作成されている。最も顕著なものが、[http://common-lisp.net/ Common-Lisp.net] や [http://clocc.sourceforge.net/ Common Lisp Open Code Collection] プロジェクトである。

Common Lisp はインクリメンタルなコンパイラとして実装されるように設計された。
関数のインライン展開のような最適化コンパイルのための標準的な宣言が言語規格に提案されている。
ほとんどの Common Lisp 実装は関数をネイティブな [[machine code|機械語]] へとコンパイルする。
その他のコンパイラは、性能では劣るが、バイナリコードのポータビリティに勝る [[bytecode|バイトコード]] へとコンパイルする。
Lisp はインタプリタ型言語であるという誤解は、そのほとんどが Common Lisp 環境がインタラクティブなプロンプトを提供し、関数をインクリメンタルにコンパイルするという事実に起因している。

[[CLISP]] のような、[[UNIX]] 上で動くいくつかの実装は、システムが [[Perl]] や [[Unix shell|シェル]] インタプリタを透過的に呼び出すのと同様に [http://clisp.cons.org/impnotes/quickstart.html#quickstart-unix スクリプトのインタプリタ] として使うことができる。

===実装のリスト===

フリーで再配布可能な実装:

* [[CMUCL] [[Carnegie Mellon University|カーネギーメロン大学]] で開発された実装を起源とする。現在はボランティアグループによりメンテナンスされる [[Free Software|フリーソフトウェア]] である。CMUCL は高速なネイティブコードコンパイラを備えている。 Intel x86 上の [[Linux]] や [[Berkeley Software Distribution|BSD]]、 Alpha 上の Linux、Solaris、IRIX、HP-UX などで動作する。
* [[Steel Bank Common Lisp]] (SBCL) は CMUCL から分岐した処理系である。"おおざっぱに言うと SBCL は CMUCL のメンテナンス性を大幅に強化したものである" [http://sbcl.sourceforge.net/history.html] SBCL は CMUCL とほぼ同じプラットフォームで動作する。 (HP-UX を除き、 Linux for PowerPC, SPARC, MIPS, [[Mac OS X]]、[[Windows]] を加える)。SBCL はインタプリタを使用せず、すべての式はネイティブコードにコンパイルされる(最近、インタプリタのサポートも試験的に実装されている)。
* [[CLISP]] はバイトコードコンパイラを備えた実装である。移植性に富み、多くの UNIX や UNIX ライクなシステム([[Mac OS X]] を含む)、Microsoft Windows、その他のオペレテーィングシステムで動作する。
* [[GNU Common Lisp]] (GCL), は [[GNU]] プロジェクトの Lisp コンパイラである。まだ完全な ANSI 準拠ではないが、数学ツールの [[Maxima]] や AXIOM, ACL2 などを含むいくつかの大規模なプロジェクトで採用されている。 GCL は 11 の異なるアーキテクチャ上の GNU/Linux で動作し、Windows や Solaris, FreeBSD でも動作する。
* [[Embeddable Common Lisp]] (ECL) は [[C (programming language)|C]] で作成されたプログラムに組み込むために設計された処理系である。
* [[OpenMCL]] [http://openmcl.clozure.com/], は Macintosh Common Lisp から派生した [[free software|フリーソフトウェア]] / [[open-source software|オープンソース]] な処理系である。その名前が示すとおり、 OpenMCL は元々 Macintosh ネイティブな処理系だったが、今は [[Mac OS X]], Darwin, GNU/Linux for PowerPC や Intel x86-64 に移植されている。
* [[Movitz]] は [[x86]] コンピュータのための Lisp 環境である。どのような OS にも依存しない。
* [[Poplog]] システムは CL を備えたバージョンが存在する。 [[POP-11]] は CL と [[Prolog]], [[Standard ML]] (SML) を備えており、複数の言語を混在させたプログラミングが可能である。また、全ての言語がインクリメンタルにコンパイルされる。コンパイラと通信する Emacs ライクなエディタが統合されている。
* [[Java (programming language)|Java]] ベースの処理系
** [[Armed Bear Common Lisp]] [http://armedbear.org/abcl.html] is a CL implementation that runs on the [[Java Virtual Machine]]. It includes a compiler to [[Java byte code]], and allows access to Java libraries from CL. Armed Bear CL is a component of the [http://armedbear.org/j.html Armed Bear J Editor], though it can be used independently.
** [[Armed Bear Common Lisp]] [http://armedbear.org/abcl.html] は [[Java Virtual Machine]] 上で動作する CL の実装である。[[Java byte code|Java バイトコード]] へのコンパイラを備えており、CL から Java のライブラリへアクセスする事が可能。Armed Bear CL は [http://armedbear.org/j.html Armed Bear J Editor] のコンポーネントであるが、単独で利用する事もできる。
** [[Jatha]] [http://jatha.sourceforge.net/] Common Lisp の大半をサブセットとして実装した Java のライブラリである

商用の実装:

* [[Allegro Common Lisp]] by [http://www.franz.com Franz, Inc.]
* [[LispWorks]] by [http://www.lispworks.com/ LispWorks Ltd.]
* [[Macintosh Common Lisp]] by [http://www.digitool.com/ Digitool, Inc.]
* [[Corman Lisp]] by [http://www.cormanlisp.com/ Corman Technologies]
* [[Scieneer Common Lisp]] by [http://www.scieneer.com/index.html Scieneer Pty Ltd.].

==アプリケーション==

Common Lisp は多くの成功した商用アプリで使用されている。もっとも有名なのは(疑うべくもなく [[Paul Graham]] の宣伝による) [[Yahoo!]] ストアである(後に C++ と Perl で書き直された)。<ref name="doubt-not-corporate-foolishness">"2003 年 1 月、Yahoo は新しいバージョンのエディタを C++ と Perl で書き直す事を発表した。それは、もはやプログラムが Lispで書かれていないというよりも、このプログラムを C++ に翻訳するために Lisp インタプリタを書くようなものであった。私の知る限、すべてのページ生成テンプレートのソースファイルは以前として Lisp コードのままだった。" [[Paul Graham]], [http://www.paulgraham.com/avg.html Beating the Averages]</ref>

*[[Orbitz]] 有名な旅行予約サイト
*[http://www.izware.com/mirai/index.htm Mirai], [http://www.izware.com/ Izware LLC] の統合された  2D/3D コンピュータグラフィックス作成環境である。ポリンゴンモデラー、先進的な IK/FK ノンリニアアニメーションシステム (後に Sega's [[Animanium]] や  Softimage XSI などによって一般化された)、2D / 3D ペインティングなどを備えていた。動画 (もっとも有名な事例は  New Line Cinema の [[The Lord of the Rings]]) やビデオゲーム、軍事シミュレーションの世界ではメジャーである。
*[http://www.piano.aero/ Piano] 飛行機のスケジュール設計や競合との比較のための商用パッケージ
*[http://www.xanalys.com/ Xanalys Corp.] 警察によって使われている世界的なセキュリティや詐欺防止サービスのための原因調査用ソフトウェア
*[http://www.ds-kti.com/ Knowledge Technologies International] [[ICAD]] 機械設計ソフトウェア
*[http://www.genworks.com/ Genworks International] の General-purpose Declarative Language (GDL) は Web ベースのエンジニアリング、デザイン、ビジネスアプリケーション作成用開発ツールである
*[http://www.noteheads.com/ Igor Engraver]: Common Lisp で作成された音楽記譜用プログラム
*[[Jak and Daxter]] Playstation2 用のビデオゲーム

Common Lisp で記述されたオープンソースなアプリケーションも存在する:

* [[ACL2]] 機能の充実した [[theorem prover|定理証明]] 用 Common Lisp
* [[Maxima]] 洗練された [[computer algebra system|コンピュータ代数処理システム]].
* [http://compo.sourceforge.net Compo] 複雑な音楽構造を自然なやり方で表現する事を可能とした言語
* [http://lisa.sourceforge.net Lisa] インテリジェントなソフトウェアエージェント作成のためのルールベースのプロダクションシステム

As well, Common Lisp is used by many government and non-profit institutions. Examples of its use in [[NASA]] include:

[[NASA]] での利用を含め、Common Lisp は多くの政府期間や非営利団体でも使用されている:

*[http://www.stsci.edu/resources/software_hardware/spike/ SPIKE] [[Hubble Space Telescope]] のプランニング/スケジューリングシステム
*[http://ic.arc.nasa.gov/projects/remote-agent/ Remote Agent] 1999 年度の NASA Software of the Year Award 受賞プログラム

==See also==

*[[Comparison of programming languages]]
*[[Common Lisp the Language]]
*[[On Lisp]]
*[[Practical Common Lisp]]

==リファレンス==

<references/>
*http://www.lisp.org/HyperSpec/Body/sec_1-1-2.html History from the [[Common Lisp HyperSpec]]

==外部リンク==

{{wikibooks}}

* The [http://ww.telent.net/cliki/index CLiki] Common Lisp に関する [[Free Software|フリーソフトウェア]] のための Wiki
* [http://www.common-lisp.net/ Common Lisp software repository]
* [http://www.cl-user.net/ The Common Lisp directory - Common Lisp に関するすべての情報のリポジトリ]
* [http://www.lisp.org/ The Association of Lisp Users].
* [http://www.computer-books.us/lisp.php Computer-Books.us] ダウンロード可能な Lisp 本のコレクション
* [http://www.flownet.com/gat/jpl-lisp.html Lisping at JPL]
* [http://cl-cookbook.sourceforge.net/ The Common Lisp Cookbook] 有用なプログラミング手法のコレクション
* [http://www.defmacro.org/ramblings/lisp.html The Nature of Lisp] XML との比較によるエッセイ
* [http://www.norvig.com/ Peter Norvig's page] Common Lisp に関する興味深いリソースを多数含んでいる

===チュートリアル===

* [http://mypage.iu.edu/~colallen/lp/ Lisp Primer] Colin Allen と Maneesh Dhagat によるチュートリアル.
* [http://www.geocities.com/fhzeya20042000/lisp.htm  Lisp tutorial by Faiz ul haque Zeya]
* [http://www.unmutual.info/startingwithcl.html A quick guide to starting with Common Lisp].
* [http://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/dst/www/LispBook/index.html Common Lisp: A Gentle Introduction to Symbolic Computation] by [[David S. Touretzky]] 初心者向け、オンラインで利用可能
* [http://www.lisperati.com/casting.html Casting SPELs in Lisp] Common Lisp の導入向け漫画

[[Category:Lisp programming language family]]
[[Category:Functional languages]]
[[Category:Object-oriented programming languages]]
[[Category:Imperative programming languages]]

[[de:Common Lisp]]
[[fr:Common Lisp]]
[[ko:?? ???]]
[[ja:Common Lisp]]
[[pt:Common Lisp]]
[[fi:Common Lisp]]
[[sv:Common Lisp]]
[[sec-3][zh:Common Lisp]]

眠いので、後半はちょう適当。あとは日本語リソースとして M.Hiroi さんの入門記事を追加とかかな〜。

posted: 2007/03/19 00:58 | permanent link to this entry | Tags: LISP

(top)  (memo)  (rss)