Common Lisp
出典: フリー百科事典『ウィキペディア(Wikipedia)』
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 に設定
; 与えられた数を二乗する関数を定義 (defun square (x) (* x x))
; 関数を実行 (square 3) ; 9 を返す
; 構造化 - 変数は let ブロックの内側にのみ存在する。つまり、既存の変数を変更せずに、 ; 任意の新しい値を導入できる。ブロックが終了すると古い変数が復帰される。 (let ((a 6) (b 4)) (+ a b)) ; returns 10
[編集] データ型
Common Lisp はたいていの言語より多くのデータ型を持っている。
[編集] スカラー型
数値 型は 整数 と 有理数、 浮動小数点、複素数 からなる。Common Lisp は数値表現に 多倍長整数 を用いて任意のサイズと精度を実現している。有理数型が分数として正確に表現されるという点は、他の言語にあまり見られない特徴である。Common Lisp は自動的にそれぞれの数値型を適切に変換する。
Common Lisp の 文字 型は、ASCII 範囲に限定されない -- これは Lisp が ASCII 以前からあった事を考えれば驚くような事ではない。 いくつかの最近の処理系は Unicode 文字をサポートしている。 [1]
シンボル 型は Lisp 言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた 名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは 値セル (value cell) と 関数セル (function cell) が最も重要なものである。 シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値 が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。例えば、キーワードパッケージ中のシンボルはすべて自己評価シンボルである。 Common Lisp における真偽値は、自己評価シンボル T と NIL によって表現される。
[編集] データ構造
Common Lisp における シーケンス 型は、リスト、ベクタ、ビットベクタ、文字列からなる。多くの操作は任意のシーケンス型に対して動作する。
他の Lisp と同様に、 Common Lisp の リスト は コンス (cons) あるいは コンスセル (cons cell)、 ペア (pair) で構成される。 コンスセルは car と cdr の二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。それぞれのコンスセルの car スロットは リストの要素(他のリストである可能性もある)を参照し、cdr スロットは次のコンスセルを参照する。ただし、最後のコンスセルの cdr だけは nil を参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。
Common Lisp は多次元の 配列 をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。 多次元配列は行列演算に利用される。 ベクタ は一次元の配列である。配列は任意の型を要素として持つことができる(一つの配列に複数の型の要素を混在させることもできる)が、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。 多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。 型指定された配列のなかで二種類が標準で定義されている。 文字列 は文字を要素としたベクタであり、ビットのベクタは ビットベクタ である。
ハッシュテーブル はデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように 必要に応じて動的にリサイズされる。
パッケージ はシンボルの集合であり、主にプログラムの一部を 名前空間 で分割するために使用される。 パッケージはいくつかのシンボルを エクスポート (export) することで、インターフェースを公開する。
構造体 は C の構造体や Pascal のレコードに似た、複数の型と値のフィールド(スロットと呼ばれる)で構成される複合的なデータ構造である。
クラスの インスタンス (instance) は構造体に似ているが、これはオブジェクトシステム 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)) が返る
関数の評価モデルは非常に単純である。評価器が (F A1 A2 ...)
のようなコードに出会うと、F というシンボルを次のうちのどれか一つであると仮定する:
- スペシャルオペレータ (これはスペシャルオペレータのリストをチェックする事で簡単に判断できる)
- マクロオペレータ (事前にマクロとして定義されている必要がある)
- 関数名 (これはシンボルか、あるいはサブフォームが
lambda
シンボルで始まっている場合)
もし F が関数名であったならば、 A1, A2, ... は引数となり左から右へ順番に評価される。そして、関数が見つかったならば、その関数呼び出しのパラメータとして使用される。
[編集] 関数定義
defun
マクロは関数を定義する。 関数定義は名前と、引数の名前、そして関数本体(body)で構成される。
(defun square (x) (* x x))
関数定義は、コンパイラに最適化設定や引数のデータ型を指定に関するヒントを与えるための 宣言 (declaration) や、 Lisp システムに対話的なドキュメンテーションを与えるための ドキュメンテーション文字列 (docstring) を含むことがある。
(defun square (x) (declare (number x) (optimize (speed 3) (debug 0) (safety 1))) "Calculates the square of the number x." (* x x))
無名関数は lambda
式を用いて定義される。 Lisp 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。
関数の定義や操作に関する多くのオペレータが存在する。たとえば、関数は compile
によって再コンパイルされる場合がある。 (いくつかの Lisp システムでは、明示的なコンパイル命令があるまで、デフォルトでは関数をインタプリタで実行するものや、オンザフライで関数を実行するたびにコンパイルするものなどがある)
[編集] 関数名前空間
関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは Common Lisp と Scheme における主要な違いである。defun
, flet
, そして labels
のようなオペレータは関数名前空間へ名前を定義する。
他の関数への引数として関数名を渡す場合には、 function
スペシャルオペレータ(通常 #' と略記される)を使う必要がある。 最初の sort
引数では、関数名前空間にシンボル >
で定義された関数名を #'>
というコードで参照している。
Scheme の評価モデルはより単純で、単一の名前空間のみが存在し、引数部分だけでなくあらゆる位置で、評価順序を問わずフォームは評価される。この事が Common Lisp と Scheme のどちらかの方言で書かれたコードは、ときどき他方の経験を持つプログラマーを混乱させることになる。たとえば、 多くの CL プログラマーは list あるいは 'string' といった説明的な変数名を使用する事を好むが、これらの名称は Scheme ではローカルに関数名を上書きしてしまうという問題を起こすことになる。
関数に独立した名前空間を持つ事が利点かどうかは、Lisp コミュニティにおける論争の源となっている。この論争は一般に Lisp-1 vs. Lisp-2 の議論 として参照される。この用語は Richard P. Gabriel と Kent Pitman らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた。 [2]
[編集] その他の型
Common Lisp が備えている他の型は以下の通り:
- Pathname は ファイルシステム におけるファイルやディレクトリを表現する。Common Lisp の Pathname 機能は、ほとんどのオペレーティングシステムのファイル命名規則より一般的なものであり、Lisp プログラムが様々なシステムを通してポータブルにファイルにアクセスする事を可能としている。
- 入出力 ストリーム は、端末やオープンされたファイルのような、バイナリデータ/テキストデータの入力元と出力先を表現する。
- Common lisp は組み込みの 仮想乱数ジェネレータ (PRNG) を備えている。 ランダムな状態 オブジェクトは仮想乱数のソースとして再利用可能であり、ユーザーが乱数の種を与える事や、同じ数列を再生する事を許可している。
- コンディション (Condition) はエラーや例外、その他のプログラムが反応する可能性がある "興味深い" イベントを表現するための型である。
- クラス (Class) は第一級のオブジェクトである。そして、それ自身が メタクラス (metaclass) と呼ばれるクラスのインスタンスである。
[編集] マクロ
Lisp における マクロ は、表面上は関数と同じように使われる。しかし、それは評価される式を表すというよりプログラムのソースコードの変形を表現している。
マクロは Lisp プログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは Perl のような言語で馴染みのある until
ループのためのフォームを実現する。
(defmacro until (test &body body) `(do () (,test) ,@body)) ;; example (until (= (random 10) 0) (write-line "Hello"))
すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。 マクロは抽象構文木(Lisp の S 式)を受けとり、それを変更して返す関数だと考えることができる。 これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。 マクロは通常の Common Lisp で記述され、任意の Common Lisp オペレータ(あるいは自作のオペレータ)を使うことができる。 上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために Common Lisp によって提供されているものである。
[編集] 変数のキャプチャとシャドウイング
Common Lisp のマクロには、マクロ展開されたコードに、呼び出し側の文脈で使われているシンボルが出現する 変数キャプチャ という機能がある。 これは、プログラマーが特殊な意味をもつシンボルを備えたマクロを作ることを可能とする。
変数キャプチャ は予期しない、一風変わったエラーを導入する可能性がある。Scheme のような他の Lisp システムでは、変数キャプチャを許さないマクロ構文 — "衛生的なマクロ (hygienic macro)" と呼ばれる — を備えているものもある。 Common Lisp では、意図しないキャプチャを避けるために、キャプチャの恐れのないマクロ展開時にユニークな変数を導入する gensym オペレータを使って回避するのが一般的である。
その他の問題として、不用意なマクロ展開時の オペレータのシャドウイング がある。たとえば、次のような (不正な) コードである。
(macrolet ((do (...) ... something else ...)) (until (= (random 10) 0) (write-line "Hello")))
UNTIL
マクロは DO
の呼び出しへと展開される事になる。この時、意図しているのは組み込みのマクロ DO
であるが、このコンテキストでは DO
はまったく異なる意味を持つことになる。
Common Lisp では、DO
のような組み込みオペレータの再定義を禁止することで、オペレータのシャドウイング問題を和らげようとしている。 さらに、ユーザーはそれぞれ自分のコードを パッケージ (package) に分離する事ができる。組み込みのシンボルは、ユーザーパッケージ内でシャドウイングされてしまっていても、COMMON-LISP
パッケージで見つけることができる。
[編集] Common Lisp Object System
- 詳細はCommon Lisp Object Systemを参照
Common Lisp は オブジェクト指向プログラミング のための道具として、 Common Lisp Object System (CLOS) を備えている。これは、現在利用可能な言語の中で、もっとも強力なオブジェクトシステムの一つである。元々アドオン機能として提案された CLOS は、Common Lisp の ANSI 標準規格の一部として採用された。 CLOS は 動的 オブジェクトシステムであり、C++ や Java のような静的な言語の OOP 機能とは根本的に異なったものである。
[編集] 他の Lisp との比較
Common Lisp と最も頻繁に比較対照されるのが Scheme である — これら二つは最も有名な Lisp 方言であるからだ。 Scheme は CL よりも古く、同じ Lispの伝統から生みだされただけでなく、同じエンジニア ガイ・スティール (彼は Gerald Jay Sussman とともに Scheme を設計した) が Common Lisp 委員会の議長を務めた。
Common Lisp は汎用目的のプログラミング言語であり、組み込み言語である Emacs Lisp や AutoLisp のような Lisp の変種とは対照的である。 それ以前の多くの Lisp とは異なり、 Common Lisp は Scheme と同様にレキシカルスコープを採用している。
ZetaLisp や Franz Lisp といった Common Lisp の設計に寄与した Lisp システムの多くは、インタプリタ内ではダイナミックスコープを、コンパイラ内ではレキシカルスコープを使っていた。Scheme は Lisp に単一のレキシカルスコープを導入した。これは、 ALGOL 68 から発想を得たものであり、広く良いアイデアであると認識されていた。 CL はダイナミックスコープをもサポートしているが、それには明示的な "special" 宣言が必要である。 ANSI CL のインタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。
時々、Common Lisp は Lisp-2 、Scheme は Lisp-1 と呼ばれることがある。これは CL が関数名と変数名にそれぞれ独立した名前を備えている事に起因した名前である。しかし、実際には CL は go タグやブロック名、 loop
キーワードなど 多くの 名前空間を持っている。複数の名前空間に関するトレードオフについて、CL と Scheme のそれぞれを支持する論争が長いあいだ行われている。Scheme では変数名と関数名の衝突を避ける必要があるため、Scheme の関数はよく lis
や lst
、lyst
といった関数名と衝突しないような引数名を取ることになる。一方 CL では引数として使う場合に、明示的に関数の名前空間を参照する必要がある -- これは上にでてきた sort
のサンプルのように一般的な事である。
CL はまた、真偽値の扱いが Scheme とは異なっている。Scheme は真と偽の表現として #t と #f という特別な値を用いている。 CL は、より古い Lisp の伝統に従って シンボルの T と NIL (NIL はまた、空リストをも表現する)を使っている。CL においては、 if
のような条件式において 任意の NIL でない値が真として扱われる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。
Scheme の標準規格は 末尾再帰の最適化 を要求しているが、CL の規格はしていない。 ほとんどの CL 実装は末尾再帰の最適化を提供するが、それでもプログラマーが最適化宣言を使った場合のみである場合が多い。 それにも関わらず、一般的な CL のコーディングスタイルは Scheme スタイルで好まれるようなあらゆる場合に再帰を使うというやり方とは異なっている -- Scheme プログラマが末尾再帰で表現するものを、CL ユーザーは do
, dolist
, loop
, 最近だと iterate
パッケージを使って反復で表現する。
[編集] 実装
Common Lisp は Perl のように唯一の実装による規定されるものではなく、Ada や C言語のように仕様によって規定されている。
さらに、実装は標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。そのような追加機能をポータブルに利用可能とする フリーソフトウェア ライブラリが作成されている。最も顕著なものが、Common-Lisp.net や Common Lisp Open Code Collection プロジェクトである。
Common Lisp はインクリメンタルなコンパイラとして実装されるように設計された。 関数のインライン展開のような最適化コンパイルのための標準的な宣言が言語規格に提案されている。 ほとんどの Common Lisp 実装は関数をネイティブな 機械語 へとコンパイルする。 その他のコンパイラは、性能では劣るが、バイナリコードのポータビリティに勝る バイトコード へとコンパイルする。 Lisp はインタプリタ型言語であるという誤解は、そのほとんどが Common Lisp 環境がインタラクティブなプロンプトを提供し、関数をインクリメンタルにコンパイルするという事実に起因している。
CLISP のような、UNIX 上で動くいくつかの実装は、システムが Perl や シェル インタプリタを透過的に呼び出すのと同様に スクリプトのインタプリタ として使うことができる。
[編集] 実装のリスト
フリーで再配布可能な実装:
- CMUCL カーネギーメロン大学 で開発された実装を起源とする。現在はボランティアグループによりメンテナンスされる フリーソフトウェア である。CMUCL は高速なネイティブコードコンパイラを備えている。 Intel x86 上の Linux や BSD、 Alpha 上の Linux、Solaris、IRIX、HP-UX などで動作する。
- Steel Bank Common Lisp (SBCL) は CMUCL から分岐した処理系である。"おおざっぱに言うと SBCL は CMUCL のメンテナンス性を大幅に強化したものである" [3] 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), は日本発のen:Kyoto Common Lispから発展した GNU プロジェクトの Lisp コンパイラである。まだ完全な ANSI 準拠ではないが、数学ツールの Maxima や AXIOM, ACL2 などを含むいくつかの大規模なプロジェクトで採用されている。 GCL は 11 の異なるアーキテクチャ上の GNU/Linux で動作し、Windows や Solaris, FreeBSD でも動作する。
- Embeddable Common Lisp (ECL) は C で作成されたプログラムに組み込むために設計された処理系である。
- OpenMCL [4], は Macintosh Common Lisp から派生した フリーソフトウェア / オープンソース な処理系である。その名前が示すとおり、 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 ベースの処理系
- Armed Bear Common Lisp [5] は Java Virtual Machine 上で動作する CL の実装である。Java バイトコード へのコンパイラを備えており、CL から Java のライブラリへアクセスする事が可能。Armed Bear CL は Armed Bear J Editor のコンポーネントであるが、単独で利用する事もできる。
- Jatha [6] Common Lisp の大半をサブセットとして実装した Java のライブラリである
商用の実装:
- Allegro Common Lisp by Franz, Inc.
- LispWorks by LispWorks Ltd.
- Macintosh Common Lisp by Digitool, Inc.
- Corman Lisp by Corman Technologies
- Scieneer Common Lisp by Scieneer Pty Ltd..
[編集] アプリケーション
Common Lisp は多くの成功した商用アプリで使用されている。もっとも有名なのは(疑うべくもなく ポール・グレアム の宣伝による) Yahoo! ストアである(後に C++ と Perl で書き直された)。[1]
- Orbitz 有名な旅行予約サイト
- Mirai, Izware LLC の統合された 2D/3D コンピュータグラフィックス作成環境である。ポリゴンモデラー、先進的な IK/FK ノンリニアアニメーションシステム (後に Sega's Animanium や Softimage XSI などによって一般化された)、2D / 3D ペインティングなどを備えていた。動画 (もっとも有名な事例は New Line Cinema の The Lord of the Rings) やビデオゲーム、軍事シミュレーションの世界ではメジャーである。
- Piano 飛行機のスケジュール設計や競合との比較のための商用パッケージ
- Xanalys Corp. 警察によって使われている世界的なセキュリティや詐欺防止サービスのための原因調査用ソフトウェア
- Knowledge Technologies International ICAD 機械設計ソフトウェア
- Genworks International の General-purpose Declarative Language (GDL) は Web ベースのエンジニアリング、デザイン、ビジネスアプリケーション作成用開発ツールである
- Igor Engraver: Common Lisp で作成された音楽記譜用プログラム
- Jak and Daxter Playstation2 用のビデオゲーム
Common Lisp で記述されたオープンソースなアプリケーションも存在する:
- ACL2 機能の充実した 定理証明 用 Common Lisp
- Maxima 洗練された コンピュータ代数処理システム.
- Compo 複雑な音楽構造を自然なやり方で表現する事を可能とした言語
- Lisa インテリジェントなソフトウェアエージェント作成のためのルールベースのプロダクションシステム
NASA での利用を含め、Common Lisp は多くの政府機関や非営利団体でも使用されている:
- SPIKE Hubble Space Telescope のプランニング/スケジューリングシステム
- Remote Agent 1999 年度の NASA Software of the Year Award 受賞プログラム
[編集] 関連項目
- プログラミング言語の比較
- Common Lisp the Language
- On Lisp
- Practical Common Lisp
[編集] 参考資料
- ^ "2003 年 1 月、Yahoo は新しいバージョンのエディタを C++ と Perl で書き直す事を発表した。それは、もはやプログラムが Lispで書かれていないというよりも、このプログラムを C++ に翻訳するために Lisp インタプリタを書くようなものであった。私の知る限り、すべてのページ生成テンプレートのソースファイルは以前として Lisp コードのままだった。" ポール・グレアム, Beating the Averages
- http://www.lisp.org/HyperSpec/Body/sec_1-1-2.html History from the Common Lisp HyperSpec
- 『LISP 原書第3版 Ⅰ』 著者:P.H. ウィンストン、B.K.P. ホーン 訳:白井 良明、井田 昌之、安部 憲広 - ISBN 4563014648
- 『LISP 原書第3版 Ⅱ』 著者:P.H. ウィンストン、B.K.P. ホーン 訳:白井 良明、井田 昌之、安部 憲広 - ISBN 4563014656
- 『Common Lisp 入門』 著者:湯浅 太一、萩谷 昌己 - ISBN 978-4000076852
- 『COMMON LISP』 著者:Guy L.,Jr. Steele、井田 昌之 - ANSI Common Lisp 以前の Common Lisp 規格書 CLtL2 - ISBN 4320025881
- 『ANSI Common Lisp』 著者:ポール・グレアム、訳:久野 雅樹,須賀 哲夫 - ANSI Common Lisp を使ったプログラミングの解説書 - ISBN4894714337
- 『入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算』 著者:新納 浩幸 - ISBN 4839920818
- Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp
- 『On Lisp』 著者:ポール・グレアム、訳:野田 開 - ISBN 978-4274066375
- Practical Common Lisp
[編集] 外部リンク
- The CLiki Common Lisp に関する フリーソフトウェア のための Wiki
- Common Lisp software repository
- The Common Lisp directory - Common Lisp に関するすべての情報のリポジトリ
- The Association of Lisp Users.
- Computer-Books.us ダウンロード可能な Lisp 本のコレクション
- Lisping at JPL
- The Common Lisp Cookbook 有用なプログラミング手法のコレクション
- The Nature of Lisp XML との比較によるエッセイ
- Peter Norvig's page Common Lisp に関する興味深いリソースを多数含んでいる
[編集] チュートリアル
- Lisp Primer Colin Allen と Maneesh Dhagat によるチュートリアル.
- Lisp tutorial by Faiz ul haque Zeya
- A quick guide to starting with Common Lisp.
- Common Lisp: A Gentle Introduction to Symbolic Computation by David S. Touretzky 初心者向け、オンラインで利用可能
- Casting SPELs in Lisp Common Lisp の導入向け漫画
カテゴリ: LISP | 関数型言語 | オブジェクト指向言語 | コンピュータ関連のスタブ項目