Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/aiflash/:/tmp:/var/tmp:/opt/alt/php82/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php82/lib/php/) in /home/aiflash/domains/wikippe.e-do-match.com/public_html/includes/shell/CommandFactory.php on line 119
Common Lisp - Wikippe コンテンツにスキップ

Common Lisp

提供: Wikippe

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

テンプレート:Lang はマルチパラダイムで汎用目的の言語である。

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

構文

テンプレート:Langテンプレート:Lang の方言であり、コードとデータ構造の表現に 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

データ型

テンプレート:Lang はたいていの言語より多くのデータ型(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

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

文字

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

シンボル

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

データ構造

シーケンス

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

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

配列

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

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

その他

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

関数

テンプレート:Lang では、 関数 もデータ型の一つである。たとえば、これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。これにより、非常に汎用化された操作を記述できるようになる。このため、テンプレート:Lang のライブラリは、多くの部分が高階関数の上に成りたっている。たとえば、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]や、テンプレート:Lang システムに対話的なドキュメンテーションを与えるためのドキュメンテーション文字列[11]を含むことがある。

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

無名関数は lambda 式を用いて定義される。 テンプレート:Lang 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。

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

総称関数とメソッドの定義

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

関数名前空間

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

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

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

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

その他の型

テンプレート:Lang が備えている他の型は以下の通り:

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

スコープ

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

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

マクロ

テンプレート:Lang系言語におけるマクロは、表面上は関数と同じように使われる。しかし、それは評価される式を表すというよりプログラムのソースコードの変形を表現している。

マクロはプログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは 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 式)を受けとり、それを変更して返す関数だと考えることができる。これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。マクロは通常の テンプレート:Lang で記述され、任意の テンプレート:Lang オペレータ(あるいは自作のオペレータ)を使うことができる。 上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために テンプレート:Lang によって提供されているものである。

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

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

変数キャプチャは予期しない、一風変わったエラーを引き起こす可能性がある。テンプレート:Lang のような他の テンプレート:Lang系のシステムでは、変数キャプチャを許さないマクロ構文[17]を備えているものもある。 テンプレート:Lang では、意図しないキャプチャを避けるために、キャプチャの恐れのないマクロ展開時にユニークな変数を導入する gensym オペレータを使って回避するのが一般的である。

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

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

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

テンプレート:Lang では、do のような組み込みオペレータの再定義を禁止することで、オペレータのシャドウイング問題を和らげようとしている。さらに、ユーザーはそれぞれ自分のコードをパッケージに分離する事ができる。組み込みのシンボルは、ユーザーパッケージ内でシャドウイングされてしまっていても、COMMON-LISP パッケージで見つけることができる。

テンプレート:Main

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

他の テンプレート:Lang 系言語との比較

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

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

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

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

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

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

実装

テンプレート:Langテンプレート:Lang言語のように唯一の実装による規定されるものではなく、テンプレート:Lang やC言語のように仕様によって規定されている。

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

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

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

実装系

再配布可能な実装の一覧

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

商用の実装

テンプレート:Lang
フランズ社[27]による実装系。
テンプレート:Lang
リスプワークス社[28]による実装系。
テンプレート:Lang
コーマン・テクノロジーズ社[29]による実装系。
テンプレート:Lang
サイエンサー社[30]による実装系。

アプリケーション

商用

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

オープンソース

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

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

テンプレート:Lang
ハッブル宇宙望遠鏡 の運用管理システム。[40]
テンプレート:Lang
1999年度の テンプレート:Lang ソフトウェア・オブ・ジ・イアー賞を受賞した。[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. テンプレート:Lang
  13. テンプレート:Lang-en-short
  14. テンプレート:Lang-en-short
  15. テンプレート:Lang-en-short
  16. テンプレート:Lang-en-short
  17. 「健全な(もしくは衛生的な)マクロ」と呼ばれる。
  18. 彼は ジェラルド・J・サスマンとともに テンプレート:Lang を設計した。
  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 月、ヤフーは新しいバージョンのエディタを テンプレート:Langテンプレート:Lang で書き直す事を発表した。それは、もはやプログラムが テンプレート:Lang で書かれていないというよりも、このプログラムを テンプレート:Lang に翻訳するために テンプレート:Lang インタプリタを書くようなものであった。私の知る限り、すべてのページ生成テンプレートのソースファイルは依然として テンプレート:Lang コードのままだった。」、ポール・グレアムテンプレート:Lang
  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/

参考文献

外部リンク

テンプレート:Wikibooks

入門書