Common Lisp

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

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

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

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

構文

Common LispLISP の方言であり、コードとデータ構造の表現に S式 を使う。関数やマクロ呼び出しはリストとして記述される。

評価モデル

関数の評価モデルは、非常に単純な「左から右」、「内側から外側」モデルである。シンボルFが関数の時、 (F A1 A2) のようなコードに出会った評価器は、その引数 A1、A2 を左から右へ順番に評価し、最後にFにその引数を渡す。

(+ 2 2) ; 2 と 2 を足す
; --> 4

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

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

構造化

変数は let ブロックを用いて定義する。変数はブロック(block)の内側にのみ存在する。同じ名前の変数を使った場合は、ブロックのたびに、既存の変数を変更せずに任意の新しい値を導入できる。ブロックが終了すると古い変数が復帰される。

(let ((a 6)
      (b 4)) 
  (+ a b))
; --> 10

テンプレート:Main

データ型

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

Lispの型システムは階層的である。型はdeftypeを用いて定義され、typeはsupertype,subtypeという概念を持つ。型はtype specifierという記述方式で参照され、これはよくtypespecと省略される。typespecは引数を取ることができる。例えば、(array fixnum (5 * 7))は、配列の型arrayvalid type specifierである。上のtypespecは、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。

typeにはプリミティブな型(整数、単精度浮動小数点、文字)と、構造体、クラス、そしてCompound Typeがある。 Compound typeは、本来の型に合わせて、特定の条件を型判定に用いることのできる型である。例えば、typemod3を以下のように定義できる。このとき、andsatisfiesCompound typeである。

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

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

lispにはHaskellにおけるような型変数の概念はない。上のarrayの例における引数は変数ではなく定数として処理されるためである。また、すべての typesupertypet (他の言語におけるtrueObjectなど)である。

アトム ATOM

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

数値 (type NUMBER)

様々な型がある。

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

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

文字

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

シンボル

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

データ構造

シーケンス

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

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

配列

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

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

その他

ハッシュテーブルはデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように必要に応じて動的にリサイズされる。パッケージはシンボルの集合であり、主にプログラムの一部を 名前空間 で分割するために使用される。パッケージはいくつかのシンボルをエクスポート[8]することで、インターフェースを公開する。構造体C言語の構造体や Pascal のレコードに似た、複数の型と値のフィールド(スロットと呼ばれる)で構成される複合的なデータ構造である。クラスのインスタンス[9]は構造体に似ているが、これはオブジェクトシステム 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))

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

 (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

総称関数もファーストクラスのデータ型である。 総称関数やメソッドには上に記載したよりも、もっと豊富な機能が存在する。

テンプレート:Main

関数名前空間

関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは Common LispScheme における主要な違いである。defunflet そして labels のようなオペレータは関数名前空間へ名前を定義する。

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

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

関数に独立した名前空間を持つ事が利点かどうかは、LISP コミュニティにおける論争の源となっている。この論争は一般に「Lisp-1 vs. Lisp-2 の議論」と言われる。この用語は リチャード・ガブリエルケント・ピットマン らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた[12]

その他の型

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

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

スコープ

他のプログラミング言語におけるプログラムと同様に、Common Lisp のプログラムも変数や関数、その他の要素を参照するために名前を用いる。名前が参照するものは、スコープによって決定されている。

名前と、それが参照する実体との関係を束縛(バインディング[16])と呼ばれている。

マクロ

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系のシステムでは、変数キャプチャを許さないマクロ構文[17]を備えているものもある。 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

テンプレート:Main

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

他の LISP 系言語との比較

Common Lisp と最も頻繁に比較対照されるのが Scheme である — これら二つは最も有名な LISP系言語だからだ。SchemeCommon Lisp よりも古く、同じ LISP の伝統から生みだされただけでなく、同じエンジニア ガイ・スティール[18]Common Lisp 委員会の議長を務めた。

Common Lisp は汎用目的のプログラミング言語であり、組み込み言語である Emacs LispAutoLisp のような LISP の変種とは対照的である。それ以前の多くの LISP系言語とは異なり、Common LispScheme と同様に構文スコープを採用している。

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

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

Common Lisp はまた、真偽値の扱いが Scheme とは異なっている。Scheme は真と偽の表現として #t#f という特別な値を用いている。 Common Lisp は、より古い LISP系言語の伝統に従ってシンボルの tnil[19]を使っている。Common Lisp においては、 if のような条件式において任意の nil でない値が真として扱われる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。

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

実装

Common LispPerl言語のように唯一の実装による規定されるものではなく、Ada やC言語のように仕様によって規定されている。

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

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

CLISP のような、UNIX 上で動くいくつかの実装は、システムが PerlUNIXシェルインタプリタを透過的に呼び出すのと同様に スクリプトのインタプリタ[20]として使うことができる。

実装系

再配布可能な実装の一覧

CMU Common Lisp (CMUCL)
カーネギーメロン大学 で開発された実装を起源とする。現在はボランティアグループによりメンテナンスされる フリーソフトウェア である。CMUCL は高速なネイティブコードコンパイラを備えている。 Intel x86 上の Linux や BSD、 Alpha 上の LinuxSolarisIRIX、HP-UX 、PowerPCを含むMac OS Xなどで動作する。
Steel Bank Common Lisp (SBCL)
CMUCL から分岐した処理系である。おおざっぱに言うと SBCL は CMUCL の保守性を大幅に強化したものである[21]。SBCL は CMUCL が動作するプラットフォームに加えて、LinuxPowerPCSPARCMIPS)、Mac OS XMicrosoft Windows 上でも動作する。ただし、HP-UX 上では動作しない。SBCL はインタプリタを使用せず、すべての式はネイティブコードにコンパイルされる[22]
CLISP
バイトコードコンパイラを備えた実装である。移植性に富み、多くの UNIX や、Mac OS X などの UNIXに類似したシステム、および Microsoft Windows、その他のオペレーティングシステムで動作する。
GNU Common Lisp (GCL)
Kyoto Common Lisp から発展した GNU プロジェクトの製品である。まだ完全な ANSI 準拠ではないが、数学ツールの MaximaAXIOMACL2 などを含むいくつかの大規模なプロジェクトで採用されている。 この処理系は 11 の異なるアーキテクチャ上の Linux で動作し、WindowsSolarisFreeBSD でも動作する。
Embeddable Common Lisp (ECL)
C言語で作成されたプログラムに組み込むために設計された処理系である。
Macintosh Common Lisp
デジタルツール社[23]製の実装系である。MCL 5.2 からオープンソース化された。PowerPC 上の Mac OS X で動作する。.
Clozure CL
以前「OpenMCL」として知られていた Macintosh Common Lisp から派生した フリーソフトウェアオープンソース な処理系である。今は Mac OS XDarwinLinuxPowerPCIntel x86-64)に移植されている。Intel x86-32 や 64ビット版の Windows への移植も進行中。[24]
Movitz
x86 アーキテクチャ用の実装系であり、オペレーティングシステムに依存しない。
Poplog
Common Lisp を備えたバージョンが存在する。 POP-11Common LispPrologStandard ML を備えており、複数の言語を混在させたプログラミングが可能である。また、全ての言語が逐次的にコンパイルされる。コンパイラと通信する Emacs に類似のエディタが統合されている。
Armed Bear Common Lisp
Java仮想マシン上で動作する実装である。同マシンのJavaバイトコードへのコンパイラを備えており、Common Lisp プログラムから Java のライブラリへアクセスする事が可能。この実装系は Armed Bear J Editor のコンポーネントであるが、単独で利用する事もできる。[25]
Jatha
Common Lisp の大半をサブセットとして実装した Java のライブラリである。[26]

商用の実装

Allegro Common Lisp
フランズ社[27]による実装系。
LispWorks
リスプワークス社[28]による実装系。
Corman Lisp
コーマン・テクノロジーズ社[29]による実装系。
Scieneer Common Lisp
サイエンサー社[30]による実装系。

アプリケーション

商用

Yahoo! ストア
買い物サービスを提供するウェブシステムである。後に C++Perl で書き直された[31]
Orbitz
有名な旅行予約サイト
Mirai
イズウェア社[32]の製品で、統合された 2D/3D コンピュータグラフィックス作成環境である。ポリゴンモデラー、先進的な IK/FK ノンリニアアニメーションシステム、2D/3D ペインティングなどを備えていた。動画やビデオゲーム、軍事シミュレーションの世界では有名である。[33]
Piano
飛行機のスケジュール設計や競合との比較のためのシステム。[34]
Xanalys
警察によって使われている世界的なセキュリティや詐欺防止サービスのための原因調査用ソフトウェア。[35]
ICAD
ナレッジ・テクノロジーズ・インターナショナル社製の機械設計ソフトウェア。
General-purpose Declarative Language
ジェンワークス・インターナショナル社[36]の製品。ウェブベースのエンジニアリング、デザイン、ビジネスアプリケーション作成用開発ツールである
Igor Engraver
  • 音楽記譜用プログラム。[37]
ジャック×ダクスター
Playstation2 用のビデオゲーム。

オープンソース

ACL2
定理証明用のシステム
Maxima
代数処理システム
Compo
複雑な音楽構造を自然なやり方で表現する事を可能とした言語。[38]
Lisa
知的エージェント作成のためのルールベースのプロダクションシステム。[39]

政府機関、非営利団体での利用

SPIKE
ハッブル宇宙望遠鏡 の運用管理システム。[40]
Remote Agent
1999年度の NASA ソフトウェア・オブ・ジ・イアー賞を受賞した。[41]

関連項目

脚注

  1. http://clhs.lisp.se/Body/t_atom.htm
  2. CLiki : Unicode support
  3. テンプレート:Lang-en-short
  4. テンプレート:Lang-en-short
  5. テンプレート:Lang-en-short
  6. テンプレート:Lang-en-short
  7. テンプレート:Lang-en-short
  8. テンプレート:Lang-en-short
  9. テンプレート:Lang-en-short
  10. テンプレート:Lang-en-short
  11. テンプレート:Lang-en-short
  12. Technical Issues of Separation in Function Cells and Value Cells
  13. テンプレート:Lang-en-short
  14. テンプレート:Lang-en-short
  15. テンプレート:Lang-en-short
  16. テンプレート:Lang-en-short
  17. 「健全な(もしくは衛生的な)マクロ」と呼ばれる。
  18. 彼は ジェラルド・J・サスマンとともに Scheme を設計した。
  19. nil はまた、空リストをも表現する。
  20. http://clisp.cons.org/impnotes/quickstart.html#quickstart-unix
  21. http://sbcl.sourceforge.net/history.html
  22. 最近、インタプリタのサポートも試験的に実装されている。
  23. http://www.digitool.com/
  24. http://trac.clozure.com/openmcl
  25. http://armedbear.org/abcl.html
  26. http://jatha.sourceforge.net/
  27. http://www.franz.com/
  28. http://www.lispworks.com/
  29. http://www.cormanlisp.com/
  30. http://www.scieneer.com/
  31. 「2003 年 1 月、ヤフーは新しいバージョンのエディタを C++Perl で書き直す事を発表した。それは、もはやプログラムが LISP で書かれていないというよりも、このプログラムを C++ に翻訳するために LISP インタプリタを書くようなものであった。私の知る限り、すべてのページ生成テンプレートのソースファイルは依然として LISP コードのままだった。」、ポール・グレアムBeating the Averages
  32. http://www.izware.com/
  33. http://www.izware.com/mirai/
  34. http://www.piano.aero/
  35. http://www.xanalys.com/
  36. http://www.genworks.com/
  37. http://www.noteheads.com/
  38. http://compo.sourceforge.net/
  39. http://lisa.sourceforge.net/
  40. http://www.stsci.edu/resources/software_hardware/spike/
  41. http://ic.arc.nasa.gov/projects/remote-agent/

参考文献

  • 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』 著者:ガイ・スティール・ジュニア、井田 昌之 - ANSI Common Lisp 以前の Common Lisp 規格書 CLtL2 - ISBN 4320025881
  • ANSI Common Lisp』 著者:ポール・グレアム、訳:久野 雅樹,須賀 哲夫 - ANSI Common Lisp を使ったプログラミングの解説書 - 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

外部リンク

テンプレート:Sister

入門書