(Translated by https://www.hiragana.jp/)
Common Lisp - Wikipedia コンテンツにスキップ

Common Lisp

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Common Lisp
パラダイム マルチパラダイムプログラミング、オブジェクト指向しこうプログラミング手続てつづがたプログラミング関数かんすうがたプログラミングメタプログラミングリフレクションジェネリックプログラミング ウィキデータを編集
登場とうじょう時期じき
  • 1984ねん (40ねんまえ) (1984)
  • 1994ねんANSIにより標準ひょうじゅん
開発かいはつしゃ ANSI X3J13委員いいんかい
型付かたつ つよ動的どうてき型付かたつ
おも処理しょりけい Allegro Common Lisp、ABCL、CLISPClozure Common LispCMU Common LispCorman LispEmbeddable Common LispGNU Common LispLispWorksMovitzScieneer Common LispSteel Bank Common LispSymbolics Common Lisp
方言ほうげん CLtL1、CLtL2、ANSI Common Lisp
影響えいきょうけた言語げんご LISP、Lisp Machine Lisp、MaclispSchemeInterlisp ウィキデータを編集
影響えいきょうあたえた言語げんご ClojureDylanEulispISLISPSKILLnewLISPPicoLispStellaSubL
プラットフォーム クロスプラットフォーム
ウェブサイト common-lisp.net ウィキデータを編集
関連かんれん言語げんご LISP
テンプレートを表示ひょうじ

Common Lisp(コモン・リスプ)は、コンピュータ・プログラミング言語げんご Lisp標準ひょうじゅん(の、ひとつ)であり、Lisp方言ほうげんのひとつでもある。Common Lispの略称りゃくしょうCL[注釈ちゅうしゃく 1]規格きかく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という概念がいねんつ。すべての typesupertype として t (言語げんごにおけるtrueObject)をもつ。したがって、すべてのオブジェクトはかたtのインスタンスである。一方いっぽうかたnilは、どのオブジェクトもそのインスタンスにならないかたである。[注釈ちゅうしゃく 2]

かたにはbuilt-inかたとそうでないものがある。built-inかたは、整数せいすう浮動ふどう小数しょうすう複素数ふくそすう文字もじとうといった(言語げんごう)プリミティブなかたに、配列はいれつやストリームなどみのかたわせたものである。built-inでないかたには、構造こうぞうたい、クラスなどがある。このように、かたシステムはクラスおよびオブジェクトシステム連続れんぞくてき融合ゆうごうされている。

かたtype specifierという記述きじゅつ方式ほうしき参照さんしょうされ、これはよくtypespec省略しょうりゃくされる。typespecもちいて議論ぎろんするじょうで、built-inとは直交ちょっこうする概念がいねんとして、Atomic Type たい Compound Typeという概念がいねんがある。Compound type は、大雑把おおざっぱには、引数ひきすうることのことができるかたである。たとえば、(array fixnum (5 * 7))は、データ内容ないようがすべて整数せいすうがたで、サイズが次元じげんごとに「5,可変長かへんちょう,7」である配列はいれつしめしている。[注釈ちゅうしゃく 3]

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)として定義ていぎされている[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 言語げんごにとっては普通ふつうだが、その言語げんごではあまりられていないかたである。シンボルとはユニークで、いくつかのスロットをそなえたきのデータオブジェクトである。シンボルのそなえるスロットのなかではセル[注釈ちゅうしゃく 4]関数かんすうセル[注釈ちゅうしゃく 5]もっと重要じゅうようなものである。シンボルは、変数へんすう保持ほじするための、言語げんごでいう識別子しきべつしとして使つかわれることおおいが、それ以外いがい用法ようほう多数たすう存在そんざいする。通常つうじょう、シンボルを評価ひょうかするとそのかえる。いくつかのシンボルは評価ひょうかするとそのシンボル自身じしんかえる。たとえば、キーワードパッケージちゅうのシンボルはすべて自己じこ評価ひょうかシンボルである。Common Lisp における真偽しんぎは、自己じこ評価ひょうかシンボル tnil によって表現ひょうげんされる。Common Lispパッケージばれるシンボルのための名前なまえ空間くうかんそなえている。

データ構造こうぞう[編集へんしゅう]

シーケンス[編集へんしゅう]

Common Lisp におけるシーケンスがたは、リスト、ベクタ、ビットベクタ、文字もじれつからなる。mapreduceなどのおおくの操作そうさは、任意にんいのシーケンスがたたいして動作どうさする。

LISPけい言語げんご同様どうようCommon Lispリストコンス[注釈ちゅうしゃく 6]コンスセル[注釈ちゅうしゃく 7]ペア[注釈ちゅうしゃく 8]ともばれる)で構成こうせいされる。コンスセルはcarとcdrふたつのスロットをそなえたデータ構造こうぞうである。リストはコンスセルをつなわせたものである。それぞれのコンスセルの car スロットはリストの要素ようそのリストである可能かのうせいもある)を参照さんしょうし、cdr スロットはつぎのコンスセルを参照さんしょうする。ただし、最後さいごのコンスセルの cdr だけは nil参照さんしょうする。コンスセルによって、簡単かんたん構造こうぞうやその複雑ふくざつなデータ構造こうぞう実現じつげんできるが、大抵たいていのデータ構造こうぞう使つかうか、クラスのインスタンスを使つかうほうが推奨すいしょうされる。

配列はいれつ[編集へんしゅう]

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

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

その[編集へんしゅう]

ハッシュテーブルはデータオブジェクトあいだ関連かんれん保持ほじする。任意にんいのオブジェクトがキーもしくはとして使用しよう可能かのうである。ハッシュテーブルは配列はいれつのように必要ひつようおうじて動的どうてきにリサイズされる。パッケージはシンボルの集合しゅうごうであり、おもにプログラムの一部いちぶ名前なまえ空間くうかん分割ぶんかつするために使用しようされる。パッケージはいくつかのシンボルをエクスポート[注釈ちゅうしゃく 9]することで、インターフェースを公開こうかいする。構造こうぞうたいC言語げんご構造こうぞうからだPascal のレコードにた、複数ふくすうかたのフィールド(スロットとばれる)で構成こうせいされるふくあいてきなデータ構造こうぞうである。クラスのインスタンス[注釈ちゅうしゃく 10]構造こうぞうたいているが、これはオブジェクトシステムによってつくられるものである。

関数かんすう[編集へんしゅう]

Common Lisp では、関数かんすう もデータがたひとつである。たとえば、これは関数かんすう引数ひきすうとして関数かんすうこと可能かのうとしたり、関数かんすうかえすような関数かんすうこと可能かのうとする。これにより、非常ひじょう汎用はんようされた操作そうさ記述きじゅつできるようになる。このため、Common Lisp のライブラリは、おおくの部分ぶぶん高階たかしな関数かんすううえりたっている。たとえば、sort 関数かんすうは、引数ひきすうとして 比較ひかくオペレータる。これは、比較ひかく関数かんすう任意にんいかたのデータを整列せいれつできるだけでなく、キーによって任意にんいのデータ構造こうぞう整列せいれつすることも可能かのうにする。

;;「 > 関数かんすう」を比較ひかくオペレータとしてもちい、リストを整列せいれつする
(sort (list 5 2 6 3 1 4) #'>)
 (6 5 4 3 2 1) 

;; リストないのサブリストちゅう最初さいしょ要素ようそ (car) に沿ってリストを整列せいれつする
(sort (list '(9 a) '(3 b) '(4 c))
      (lambda (x y) (< (car x) (car y))))
 ((3 b) (4 c) (9 a))

関数かんすう定義ていぎ[編集へんしゅう]

defun マクロは関数かんすう定義ていぎする。関数かんすう定義ていぎ名前なまえと、引数ひきすう名前なまえ、そして関数かんすう本体ほんたい構成こうせいされる。

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

関数かんすう定義ていぎは、コンパイラに最適さいてき設定せってい引数ひきすうのデータがた指定していかんするヒントをあたえるための 宣言せんげん[注釈ちゅうしゃく 11]や、LISP システムに対話たいわてきなドキュメンテーションをあたえるためのドキュメンテーション文字もじれつ[注釈ちゅうしゃく 12]ふくむことがある。

(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")
 "ZippyPinhead"

(add 2 3)
 5

総称そうしょう関数かんすうもファーストクラスのデータがたである。 総称そうしょう関数かんすうやメソッドにはうえ記載きさいしたよりも、もっと豊富ほうふ機能きのう存在そんざいする。

関数かんすう名前なまえ空間くうかん[編集へんしゅう]

関数かんすうめいのための名前なまえ空間くうかんは、データ変数へんすうのための名前なまえ空間くうかんとは分離ぶんりされている。これは Common LispScheme における主要しゅようちがいである。defunflet そして labels のようなオペレータは関数かんすう名前なまえ空間くうかん名前なまえ定義ていぎする。

関数かんすうへの引数ひきすうとして関数かんすうめいわた場合ばあいには、function スペシャルオペレータ(通常つうじょう #'略記りゃっきされる)を使つか必要ひつようがある。最初さいしょsort 引数ひきすうでは、関数かんすう名前なまえ空間くうかんにシンボル >定義ていぎされた関数かんすうめい#'> というコードで参照さんしょうしている。

Scheme評価ひょうかモデルはより単純たんじゅんで、単一たんいつ名前なまえ空間くうかんのみが存在そんざいし、引数ひきすう部分ぶぶんだけでなくあらゆる位置いちで、評価ひょうか順序じゅんじょわずフォームは評価ひょうかされる。このことCommon LispScheme のどちらかの方言ほうげんかれたコードは、ときどき他方たほう経験けいけんつプログラマーを混乱こんらんさせることになる。たとえば、Common Lisp プログラマーのおおくは list あるいは string といった説明せつめいてき変数へんすうめい使用しようすることこのむが、これらの名称めいしょうScheme ではローカルに関数かんすうめい上書うわがきしてしまうという問題もんだいこすことになる。ただし、これには一長一短いっちょういったんがある。名前なまえ空間くうかんかれているために、高階たかしな関数かんすうなどにわた関数かんすう名前なまえは、そのままではなく、関数かんすう名前なまえであることを明示めいじする必要ひつよう発生はっせいしてしまっている。

関数かんすう独立どくりつした名前なまえ空間くうかんこと利点りてんかどうかは、LISP コミュニティにおける論争ろんそうみなもととなっている。この論争ろんそう一般いっぱんに「Lisp-1 vs. Lisp-2議論ぎろん」とわれる。この用語ようごリチャード・ガブリエルケント・ピットマン らによるふたつの手法しゅほう広範囲こうはんいにわたって比較ひかくした 1988 ねん論文ろんぶんつくられた[3]

そのかた[編集へんしゅう]

Common Lispそなえているほかかた以下いかとおり:

  • パスめいファイルシステム におけるファイルやディレクトリを表現ひょうげんする。Common Lisp のパスめい機能きのうは、ほとんどのオペレーティングシステムのファイル命名めいめい規則きそくより一般いっぱんてきなものであり、プログラムが様々さまざまなシステムをとおしてポータブルにファイルにアクセスすること可能かのうとしている。
  • 入出力にゅうしゅつりょくストリームは、端末たんまつひらかれているファイルのような、バイナリデータ、テキストデータの入力にゅうりょくもと出力しゅつりょくさき表現ひょうげんする。
  • Common Lisp組込くみこみの 擬似ぎじ乱数らんすう生成せいせい(PRNG)をそなえている。ランダムな状態じょうたいオブジェクトは擬似ぎじ乱数らんすうのソースとしてさい利用りよう可能かのうであり、ユーザーが乱数らんすうたねあたえることや、おな数列すうれつ再生さいせいすること許可きょかしている。
  • コンディション[注釈ちゅうしゃく 13]はエラーや例外れいがい、そののプログラムが反応はんのうする可能かのうせいがある有意ゆういなイベントを表現ひょうげんするためのかたである。
  • クラス[注釈ちゅうしゃく 14]だいいちきゅうのオブジェクトである。そして、それ自身じしんがメタクラス[注釈ちゅうしゃく 15]ばれるクラスのインスタンスである。

スコープ[編集へんしゅう]

のプログラミング言語げんごにおけるプログラムと同様どうように、Common Lisp のプログラムも変数へんすう関数かんすう、その要素ようそ参照さんしょうするために名前なまえもちいる。名前なまえ参照さんしょうするものは、スコープによって決定けっていされている。

名前なまえと、それが参照さんしょうする実体じったいとの関係かんけい束縛そくばく(バインディング[注釈ちゅうしゃく 16])とばれている。

マクロ[編集へんしゅう]

LISPけい言語げんごにおけるマクロは、表面ひょうめんじょう関数かんすうおなじように使つかわれる。しかし、それは評価ひょうかされるしきあらわすというよりプログラムのソースコードの変形へんけい表現ひょうげんしている。

マクロはプログラマーに言語げんごないあたらしい構文こうぶんフォームをつくこと可能かのうとする。たとえば、このマクロは Perl のような言語げんご馴染なじみのある until ループのためのフォームを実現じつげんする。

(defmacro until (test &body body)
  `(do ()
       (,test)
     ,@body))

;; 利用りようれい
(until (= (random 10) 0) 
  (write-line "Hello"))

;; 定義ていぎしたuntilのマクロ展開てんかい
(macroexpand-1 '(until (= (random 10) 0) 
                 (write-line "Hello")))
 (DO ()
       ((= (RANDOM 10) 0))
     (WRITE-LINE "Hello"))
  T

すべてのマクロは、うちふくむソースコードが評価ひょうか、あるいはコンパイルされるよりもまえかなら展開てんかいされる。マクロは抽象ちゅうしょう構文こうぶん(S しき)をけとり、それを変更へんこうしてかえ関数かんすうだとかんがえることができる。これらの関数かんすうは、最終さいしゅうてきなソースコードを生成せいせいするために評価ひょうかやコンパイラよりもまえされる。マクロは通常つうじょうCommon Lisp記述きじゅつされ、任意にんいCommon Lisp オペレータ(あるいは自作じさくのオペレータ)を使つかうことができる。 うえれい使用しようされているバッククォート記法きほう一般いっぱんてきなコードテンプレートへの代入だいにゅう単純たんじゅんするために Common Lisp によって提供ていきょうされているものである。

Common Lisp Object System[編集へんしゅう]

Common Lispオブジェクト指向しこうプログラミング のための道具どうぐとして、Common Lisp Object SystemCLOS)をそなえている。これは、現在げんざい利用りよう可能かのう言語げんごなかで、もっとも強力きょうりょくなオブジェクトシステムのひとつである。1984ねん当初とうしょのCommon Lispにはふくまれていなかったが、のちCommon LispANSI 標準ひょうじゅん規格きかく一部いちぶとなった。C++Java のような静的せいてき言語げんごのオブジェクト指向しこう機能きのうとは根本こんぽんてきことなった動的どうてきオブジェクトシステムである。

の LISP けい言語げんごとの比較ひかく[編集へんしゅう]

Common Lispもっと頻繁ひんぱん比較ひかく対照たいしょうされるのが Scheme である — これらふたつはもっと有名ゆうめいLISPけい言語げんごだからだ。SchemeCommon Lisp よりもふるく、おなLISP伝統でんとうからみだされただけでなく、おなじエンジニアのガイ・スティール・ジュニア[注釈ちゅうしゃく 17]Common Lisp 委員いいんかい議長ぎちょうつとめた。

以前いぜんおおくのLispの方言ほうげん実装じっそうとはことなり、Common Lisp は Scheme と同様どうような、スコープは静的せいてきスコープのみを基本きほんとする仕様しようである。

Lisp Machine Lisp や MACLISP といった Common Lisp の設計せっけい寄与きよした実装じっそうおおくは、インタプリタでは動的どうてきスコープを、コンパイラでは静的せいてきスコープ、という挙動きょどうになっていた。Schemeはそういったものとはことなり、静的せいてきスコープのみであった。Common Lisp は動的どうてきスコープをもサポートしているが、明示めいじてきspecial 宣言せんげん必要ひつようである。ANSI Common Lisp のインタプリタとコンパイラのあいだにはスコープにかんしてのあいことてんまった存在そんざいしない。

時々ときどきCommon Lisp は「Lisp-2」、Scheme は「Lisp-1」とばれることがある。これは Common Lisp関数かんすうめい変数へんすうめい(2つ)にそれぞれ独立どくりつした名前なまえそなえていること起因きいんした名前なまえである。しかし、実際じっさいには Common Lispgo タグやブロックめいloop キーワードなどおおくの名前なまえ空間くうかんっているし、マクロをうまく使つかえば、構文こうぶんてき名前なまえ空間くうかん追加ついかすることも出来できる。複数ふくすう名前なまえ空間くうかんかんするトレードオフについて、Common LispScheme のそれぞれを支持しじする論争ろんそうながいあいだおこなわれている。Scheme では変数へんすうめい関数かんすうめい衝突しょうとつける必要ひつようがあるため、Scheme関数かんすうはよく lislstlyst といった関数かんすうめい衝突しょうとつしないような引数ひきすうめいることになる。一方いっぽう Common Lisp では引数ひきすうとして使つか場合ばあいに、明示めいじてき関数かんすう名前なまえ空間くうかん参照さんしょうする必要ひつようがある。これはうえにでてきた sort のサンプルのように一般いっぱんてきなことである。

Common Lisp はまた、真偽しんぎいが Scheme とはことなっている。Schemeしんにせ表現ひょうげんとして #t#f という特別とくべつもちいている。Common Lisp は、よりふるLISPけい言語げんご伝統でんとうしたがってシンボルの tnil[注釈ちゅうしゃく 18]使つかっている。Common Lisp においては、if のような条件じょうけんしきにおいて任意にんいnil でないしんとしてあつかわれる。このことは、いくつかのオペレータが述語じゅつごとしてはたらくと同時どうじに、計算けいさん使つかうための有意ゆういかえすものとして動作どうさすること可能かのうとしている。

Scheme標準ひょうじゅん規格きかく末尾まつび再帰さいき最適さいてき要求ようきゅうしているが、Common Lisp規格きかくはしていない。ほとんどの Common Lisp 実装じっそう末尾まつび再帰さいき最適さいてき提供ていきょうするが、それでもプログラマーが最適さいてき宣言せんげん使つかった場合ばあいのみである場合ばあいおおい。それにもかかわらず、一般いっぱんてきCommon Lisp のコーディングスタイルは Scheme スタイルでこのまれるようなあらゆる場合ばあい再帰さいき使つかうというやりかたとはことなっている。Scheme プログラマが末尾まつび再帰さいき表現ひょうげんするものを、Common Lisp プログラマーは dodolistloopひとし反復はんぷく構文こうぶん表現ひょうげんする。

実装じっそう[編集へんしゅう]

Common Lisp は、唯一ゆいいつ実装じっそうにより規定きていされるものではなく、Ada やC言語げんごのように仕様しようによって規定きていされている。

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

Common Lisp評価ひょうかしき評価ひょうかするまえにコンパイルする所謂いわゆるインクリメンタルなコンパイラとして実装じっそう可能かのうなように設計せっけいされている[4]関数かんすうのインライン展開てんかいのような最適さいてきコンパイルのための標準ひょうじゅんてき宣言せんげん言語げんご規格きかくない規定きていされており、おおくの Common Lisp 実装じっそう関数かんすう機械きかいへとコンパイルする。また、性能せいのうではおとるが、バイトコードへとコンパイルする処理しょりけい存在そんざいする。また、コンパイルみのコードとコンパイルされていないコードを混交こんこうさせても動作どうさ差異さいがないように言語げんご設計せっけいされているためインタプリタ搭載とうさいする処理しょりけいでもコンパイラのみ搭載とうさい処理しょりけい動作どうさちがいがない。

CLISP のような、UNIX うえうごくいくつかの実装じっそうは、システムが PerlUNIXシェルインタプリタを透過とうかてきすのと同様どうように スクリプトのインタプリタ[5]として使つかうことができる。

処理しょりけい[編集へんしゅう]

さい配布はいふ可能かのう実装じっそう一覧いちらん[編集へんしゅう]

Steel Bank Common Lisp (SBCL)
後述こうじゅつのCMUCL から分岐ぶんきして保守ほしゅせい大幅おおはば強化きょうかした処理しょりけい[6]であり、現在げんざい通常つうじょうのx86コンピュータでもっと使用しようされている実装じっそうひとつ。SBCL は、REPLから入力にゅうりょくされた評価ひょうかしきであっても、インタプリタをかいさずすべてネイティブコードにコンパイルしてから実行じっこうする[注釈ちゅうしゃく 19]。CMUCLゆずりのコンパイラにより非常ひじょう強力きょうりょく最適さいてきおこなうことが出来でき生成せいせいするコードはC言語げんごのコードを上回うわまわることもある。SBCL は、CMUCL が動作どうさするプラットフォームにくわえて、LinuxPowerPCSPARCMIPS)、Mac OS XMicrosoft Windows うえでも動作どうさする。ただし、HP-UX じょうでは動作どうさしない。
Clozure Common Lisp (CCL)
フリー処理しょりけいであり、SBCLとならんで使用しようされている実装じっそう祖先そせんはMacintoshをプラットフォームとするMacintosh Common Lispという商用しょうよう処理しょりけいであったが、のOSプラットフォームへオープンソースとしてフォークされるようになり混同こんどうけるためClozure CLと改名かいめいした[7]。その歴史れきしのため、Mac OS の Cocoa API との連携れんけい(実装じっそうによる独自どくじ機能きのう)につよみをもつほか、ファイルの遅延ちえんローディング、デバッグメッセージのわかりやすさなどの特色とくしょくつ。現在げんざいMac OS XDarwinLinuxPowerPCIntel x86-64)Windows移植いしょくされている。[8]
Embeddable Common Lisp (ECL)
後述こうじゅつのGCLから派生はせいした、C言語げんご作成さくせいされたプログラムにむために設計せっけいされた処理しょりけいである。lispコードはCのコードに変換へんかんされたうえでコンパイル実行じっこうされるので、最低限さいていげんのCコンパイラしか提供ていきょうされていない機器ききなどの環境かんきょうでも、クロスコンパイルにより利用りようすることが出来できる。また、C言語げんご高速こうそくせいいでいる。
Armed Bear Common Lisp (ABCL)
Java仮想かそうマシンうえ動作どうさする実装じっそうである。どうマシンのJavaバイトコードへのコンパイラをそなえており、Common Lisp プログラムから Java のライブラリにアクセスすること可能かのう。この処理しょりけいArmed Bear J Editor のコンポーネントであるが、単独たんどく利用りようすることもできる。[9]近年きんねんもアクティブに開発かいはつされている。
CMU Common Lisp (CMUCL)
カーネギーメロン大学だいがく開発かいはつされた実装じっそう起源きげんとする。現在げんざいはボランティアグループによりメンテナンスされる。Pythonとばれる(プログラミング言語げんごの Python とは関連かんれんなし)高速こうそくなネイティブコードコンパイラの起源きげんとなった実装じっそうである。Intel x86 じょうLinux や BSD、Alpha うえLinuxSolarisIRIX、HP-UX、PowerPCふくMac OS Xなどで動作どうさする。
CLISP
バイトコードコンパイラをそなえた実装じっそうである。移植いしょくせいみ、おおくの UNIX や、Mac OS X などの UNIX類似るいじしたシステム、および Microsoft Windows、そののオペレーティングシステムで動作どうさする。
GNU Common Lisp (GCL)
Kyoto Common Lisp から発展はってんしたGNUプロジェクト製品せいひんである。完全かんぜんANSI 準拠じゅんきょではないが、数学すうがくツールの MaximaAXIOMACL2 などをふくむいくつかのだい規模きぼなプロジェクトで採用さいようされている。この処理しょりけいは 11 のことなるアーキテクチャじょうLinux動作どうさし、WindowsSolarisFreeBSD でも動作どうさする。[10]
Macintosh Common Lisp (MCL)
デジツールしゃ[11]せい処理しょりけいである。MCL 5.2 からオープンソースされた。PowerPC うえMac OS X動作どうさする。
Movitz
x86 アーキテクチャよう処理しょりけいであり、オペレーティングシステムに依存いぞんしない。
Poplog
Common Lispそなえたバージョンが存在そんざいする。POP-11Common LispPrologStandard MLそなえており、複数ふくすう言語げんご混在こんざいさせたプログラミングが可能かのうである。また、すべての言語げんご逐次ちくじてきにコンパイルされる。コンパイラと通信つうしんする Emacs類似るいじのエディタが統合とうごうされている。
Jatha
Common Lisp大半たいはんをサブセットとして実装じっそうした Java のライブラリである。[12]
Corman Lisp
Windowsよう統合とうごう開発かいはつ環境かんきょう。コーマン・テクノロジーズ[13]による商用しょうよう処理しょりけいだったが、2015ねんにオープンソース[14]

商用しょうよう実装じっそう[編集へんしゅう]

Allegro Common Lisp
Franz(フランツ)[15]による処理しょりけい
LispWorks
LispWorks(リスプワークス)[16]による処理しょりけい
Scieneer Common Lisp
Scineneer(サイエニア)[17]による処理しょりけい

著名ちょめいなアプリケーション[編集へんしゅう]

政府せいふ機関きかん営利えいり団体だんたいでの利用りよう[編集へんしゅう]

SPIKE
ハッブル宇宙うちゅう望遠鏡ぼうえんきょう 運用うんよう管理かんりのためのプランニング・スケジューリングシステム。[18] 角度かくど変更へんこうや、指定してい地点ちてん撮影さつえいなどのさまざまな指令しれいを、燃料ねんりょう希望きぼう時間じかんたいなど多様たようかつ複雑ふくざつ制約せいやくのもとで、最適さいてきスケジューリングする。
Remote Agent (remote intelligent self-repair software, RAX)
NASA Deep Space 1搭載とうさいされた、自己じこ修復しゅうふく監視かんしよう人工じんこう知能ちのう。NASA Ames Research Center および NASA JPLによって開発かいはつされた。人間にんげん監視かんしなしで探索たんさく航行こうこうさせるための自律じりつエージェント。多数たすうのコンポーネントからなるが、その主要しゅような3つは、EUROPA(マーズ・エクスプロレーション・ローバー のためのプランニングシステム)、EXEC(プラン実行じっこうシステム)、Livingstone(モデルベース異常いじょう診断しんだんシステム)である。1999年度ねんどNASA ソフトウェア・オブ・ジ・イアーしょう受賞じゅしょうした。[19]

商用しょうよう[編集へんしゅう]

Yahoo! ストア
en:Viawebにより作成さくせいされ、のちにYahoo!に買収ばいしゅうされた。だれでも簡単かんたん使つかえるウェブストア作成さくせいサービスを提供ていきょうし、顧客こきゃくつくったウェブサイトでのユーザがものをするという、史上しじょうはじめてのアプリケーションサービスプロバイダである。のちに C++ と Perl でなおされた(と発表はっぴょうされた)。ポール・グレアムによればその実態じったいは「C++でLispインタプリタをいた」というようなものだった、という[20]
ジャック×ダクスター,クラッシュ・バンディクーひとし
ノーティードッグによるPlayStation、PlayStation 2 ようのビデオゲーム。クラッシュ・バンディクーはGOOL(Game Oriented Object Lisp)[21]、ジャック×ダクスターはGOOLを機能きのうてき拡張かくちょうしたぜんべつ言語げんごGame Oriented Assembly Lispによって実装じっそうされている。これらは、プレイステーションらの特殊とくしゅなプロセッサ事情じじょうわせた自作じさくコンパイラをふくんでいる。
D-Wave 1 量子りょうし計算けいさん
D-Wave Systems による量子りょうし計算けいさん(まさしくは断熱だんねつ量子りょうしアニーリング専用せんようハードウェア)。ホストOSがCommon Lispで作成さくせいされている[22]。ただし、利用りようしゃけのインターフェースはPython APIである。求人きゅうじんページにおいても、Common Lisp(あるいは関数かんすうがた言語げんご)のプログラミング経験けいけん求人きゅうじん要件ようけんとしてあげている[23]
Orbitz
ITA Softwareによって開発かいはつされた、有名ゆうめい旅行りょこうやくサイト。ITA Software は2011ねんに Google に買収ばいしゅうされ、一部いちぶもんとなっている[24]旅行りょこう予約よやくには、莫大ばくだいかず可能かのう経路けいろなかから高速こうそく最短さいたんさいやす路線ろせん選択せんたくする知的ちてき探索たんさくアルゴリズムが必要ひつようであり、そのためにLispがもちいられている。
Mirai
イズウェアしゃ[25]製品せいひんで、統合とうごうされた 2D/3D コンピュータグラフィックス作成さくせい環境かんきょうである。ポリゴンモデラー、先進せんしんてきな IK/FK ノンリニアアニメーションシステム、2D/3D ペインティングなどをそなえていた。動画どうがやビデオゲーム、軍事ぐんじシミュレーションの世界せかいでは有名ゆうめいである。[26]
Piano
飛行機ひこうきのスケジュール設計せっけい競合きょうごうとの比較ひかくのためのシステム。[27]
Xanalys
警察けいさつによって使つかわれている世界せかいてきなセキュリティや詐欺さぎ防止ぼうしサービスのための原因げんいん調査ちょうさようソフトウェア。[28]
ICAD
ナレッジ・テクノロジーズ・インターナショナルしゃせい機械きかい設計せっけいソフトウェア。
General-purpose Declarative Language
ジェンワークス・インターナショナルしゃ[29]製品せいひん。ウェブベースのエンジニアリング、デザイン、ビジネスアプリケーション作成さくせいよう開発かいはつツールである
Igor Engraver
音楽おんがくようプログラム。[30]

オープンソース[編集へんしゅう]

Maxima
代数だいすうてき数式すうしき処理しょりエキスパートシステム。GPL で公開こうかいされており、自由じゆう入手にゅうしゅすることができる。微分びぶん方程式ほうていしき不定ふてい積分せきぶんのようにかいしきであるものは、人間にんげんくのとおなじように、しきかたちかいかえすことができる。Richard Fateman教授きょうじゅによって作成さくせいされたMacsymaの、Common Lisp じょうさい実装じっそうである。
ACL2
定理ていり証明しょうめいようのシステム
Compo
複雑ふくざつ音楽おんがく構造こうぞう自然しぜんなやりかた表現ひょうげんすること可能かのうとした言語げんご[31]
Lisa
知的ちてきエージェント作成さくせいのためのルールベースのプロダクションシステム。[32]

注釈ちゅうしゃく[編集へんしゅう]

  1. ^ ごくまれにclispとも。なおCLISPという実装じっそう実在じつざいするので混同こんどう回避かいひのためあまりもちいられない
  2. ^ 一方いっぽうかたnullは、オブジェクトNILあらわかたである。
  3. ^ このようなtypespecは、配列はいれつかたarrayvalid type specifierである。
  4. ^ えい: value cell
  5. ^ えい: function cell
  6. ^ えい: cons
  7. ^ えい: cons cell
  8. ^ えい: pair
  9. ^ えい: export
  10. ^ えい: instance
  11. ^ えい: declaration
  12. ^ えい: docstring
  13. ^ えい: condition
  14. ^ えい: class
  15. ^ えい: metaclass
  16. ^ えい: binding
  17. ^ かれは ジェラルド・J・サスマンとともに Scheme設計せっけいした。
  18. ^ nil はまた、そらリストをも表現ひょうげんする。
  19. ^ 最近さいきん、インタプリタのサポートも試験しけんてき実装じっそうされている。

出典しゅってん[編集へんしゅう]

  1. ^ CLHS: Type ATOM
  2. ^ CLiki : Unicode support
  3. ^ Technical Issues of Separation in Function Cells and Value Cells
  4. ^ 3.1 Evaluation
  5. ^ 32.6. Quickstarting delivery with CLISP
  6. ^ History and Copyright - Steel Bank Common Lisp
  7. ^ Clozure CL History
  8. ^ http://trac.clozure.com/openmcl
  9. ^ http://armedbear.org/abcl.html
  10. ^ http://www.gnu.org/software/gcl/
  11. ^ http://www.digitool.com/
  12. ^ http://jatha.sourceforge.net/
  13. ^ http://www.cormanlisp.com/
  14. ^ https://github.com/sharplispers/cormanlisp
  15. ^ http://www.franz.com/
  16. ^ http://www.lispworks.com/
  17. ^ http://www.scieneer.com/
  18. ^ http://www.stsci.edu/resources/software_hardware/spike/
  19. ^ http://ic.arc.nasa.gov/projects/remote-agent/
  20. ^ 「2003 ねん 1 がつ、ヤフーはあたらしいバージョンの、C++ と Perl でかれたエディタ(訳注やくちゅう: Viawebのシステムのうち、Lispでかれていた、サイトを構築こうちくするシステムの部分ぶぶん)をリリースした。それは『もはやプログラムは Lisp でかれていない』というよりも『プログラムを C++ に変換へんかんするために Lisp インタプリタをいた』というようなものであった。わたしかぎり、すべてのページ生成せいせいテンプレートのソースファイルは依然いぜんとして Lisp コードのままだった(「グリーンスパンのだい10法則ほうそく」をよ)。」、ポール・グレアムBeating the Averages
  21. ^ http://all-things-andy-gavin.com/2011/03/12/making-crash-bandicoot-gool-part-9/
  22. ^ ページ下部かぶ,開発かいはつしゃのコメント http://dwave.wordpress.com/2011/05/20/learning-to-program-the-d-wave-one-software-you-should-install-a-book-you-should-buy/
  23. ^ http://www.dwavesys.com/careers/senior-software-developer
  24. ^ http://www.itasoftware.com/about/index.html
  25. ^ http://www.izware.com/
  26. ^ http://www.izware.com/mirai/
  27. ^ http://www.piano.aero/
  28. ^ http://www.xanalys.com/
  29. ^ http://www.genworks.com/
  30. ^ http://www.noteheads.com/
  31. ^ http://compo.sourceforge.net/
  32. ^ 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
  • 実用じつようCommon Lisp 著者ちょしゃ:ピーター・ノーヴィグ - ISBN 978-4798118901
  • On Lisp著者ちょしゃ:ポール・グレアム、わけ野田のだ ひらく - ISBN 978-4274066375
  • 実践じっせん Common Lisp』 ペーター・ザイベルちょ佐野さのただししゅんみずまるあつしえんじょう雅之まさゆき金子かねこ祐介ゆうすけ どもやく - ISBN 978-4274067211

外部がいぶリンク[編集へんしゅう]

入門にゅうもんしょ[編集へんしゅう]