この項目はプログラミング言語について記述しています。声優ユニットについては『LISP(声優ユニット)』を参照してください。
この項目は検閲されています。一部の文章は検閲により読めなくなっている場合があります。
LISPとは、そびえ立つ括弧の山プログラミング言語である。神やパソコンの父は天地創造の道具や建材に使うが、一般人には真似できない。
(概 要)
名前はLots of Insane Stupid ParenthesesLISt Processingの省略である。
その歴史は1958年にまでさかのぼり、当時MITにいたジョン・マッカーシーによって発明された。プログラミング言語としては2番目に古い(最古はFORTRANで1957年)。また初の関数型プログラミング言語である。ガベージコレクションやファーストクラスの関数、レキシカルクロージャなどをいち早く導入していった言語であるため、現存するほとんどのプログラミング言語に影響を与えている。
非常に単純なため、純粋なLISPの実装はほぼすべてのプログラミング言語で実装可能と言われている。
'(文 法)
リストの書き方は、例えば先頭要素「動画」、第二要素「コミュニティ」、第三要素「大百科」ならば、
と書けばよい。これはS式(symbolic expression)というポーランド記法として評価(eval: evaluation)され、「動画」という関数に「コミュニティ」 「大百科」という2つの引数を与えたものとして計算される。
命令の記述の引数として用いる場合は先頭に命令ではないことを示すためシングルクオーテーションが必要になる。
空のリスト()はnil(noneの砕けた英語表現)で表し、真偽値の偽の値としても用いる。nilでない値は真と扱われる。
他、LISPに必須な命令は以下である。
- car (リストの先頭要素の抜き出し): content of address part of register
(car '(動画 コミュニティ 大百科))
これで「動画」という要素が出力される。 - cdr (リストから先頭要素を除く): content of decrement part of register
(cdr '(動画 コミュニティ 大百科))
これで「動画」という要素が取り除かれ(コミュニティ 大百科)
というリストが出力される。 - cons (要素のリストへの結合): construct
(cons ニコニコ '(動画 コミュニティ 大百科))
これで「ニコニコ」という要素が先頭に追加され(ニコニコ 動画 コミュニティ 大百科)
というリストが出力される。 - quote (これがついていると評価されない。リストにつける。シングルクオーテーションで代用される)
- eq (2つのものが同一ならt: trueを、そうでない時にnilを返す): equal
- atom (値がペアでない: アトムである時にtを、そうでない時にnilを返す)
- cond (if文に相当): condition
- defun (関数定義命令): define function
これらを組み合わせていけばチューリング完全が実現できる。しかし、現実にはこれだけでは実用にならないので一般には様々な命令を追加した方言が使われている。方言については下記の項を参照のこと。
(LIS (P '(e r))
LISPを使う者のことをLISPer、Lisperなどと呼ぶ。※スーパースリムだったり多い日も安心だったりはしない。
(方 '(言))
LISPに必要な要素は少ないので、実用的に使うために拡張したり、分野ごとに特殊化したりと、様々な方言がある。別にLISPer同士の仲が悪いわけではない。Lisp-1とLisp-2で論争が起きたり、Common LisperがSchemerをdisっていたり、Schemerがfuncallや#'をゴミ箱に投げ捨てようとしていたり、R6RS Schemeの策定でScheme界で大揉めしたりしても、決して仲が悪いわけではない。
Lisp-1とLisp-2
Lisp方言を分類するときにLisp-1とLisp-2という区別をすることがある。関数と変数の名前空間が共通なのがLisp-1で、別々なのがLisp-2である。
名前空間が1つなのがLisp-1(Scheme, Clojureなど)で、2つなのがLisp-2(Common Lispなど)である。ね、簡単でしょ?
Emacs Lisp
文句なしに、世界で最も「何でLISPなのよ…」と思われている使われているLISP。
世界で最も人気のあるテキストエディタのひとつであるEmacsで使われている方言で、この方言の処理系が搭載されていることで、Emacsは非常に優れた拡張性を持つ。
Scheme
1975年に考案された。言語機能のコンパクトさを重視している。黒板での動作に定評がある。
現行規格R6RSの策定の際、Sussmanにキレられたり、主要処理系開発者に軒並み反対されたり、対抗規格のERR5RSを立ち上げられたり、あわや暗黒時代の到来か、という黒歴史を演出した。
Common Lisp
1980年代から策定が始まり、1994年に正式な規格が制定された。実用性重視で仕様が使ってる人間でも覚えられない程大きい。C++と仕様の巨大さ、複雑さで戦える選ばれた戦士のひとり。
Schemeと対照的に、それ以前のLISPからの影響が強く、関数の名前などは、多くを従来のものから受け継いでいる。また、産業界からの影響も大きく、コンパイラの最適化の制御、ステップ実行、ブレークポイントなどといった、実用的な機能が仕様で定義されている。
Clojure
2007年に登場したコーヒーの国からの新たな刺客。設計者は金持ちニートRich Hickey。Java仮想マシン上で動作する。
Javaとの連携の容易さと、ソフトウェアトランザクショナルメモリによる並行コンピューティングが特徴。データ構造がイミュータブルであり、副作用を避ける関数型寄りの設計。また、パターンマッチングなどの要素も柔軟に取り込んでいる。
Arc
2001年に開発が始まり、2008年に最初のリリースをされた。こちらは本当の金持ちが作った。
構文木の要素を最小限にするというコンセプトに基づいて、大胆な変更がされている。文法の導入をあまり好まないLISPコミュニティの中にあって、前述のコンセプトに当てはまれば、新しい文法も柔軟に取り入れる方針。
(処 (理 系))
LISPと表記するのが正式とされているが、オリジナルのLISPを全て大文字で表記し、方言はLispと表記するという話もある。
- Steel Bank Common Lisp
最も人気のあるANSI Common Lisp処理系のひとつ。ネイティブコードコンパイラ。生成するオブジェクトコードの速さに定評がある。 - CLISP
移植性の高いANSI Common Lispの処理系。バイトコードコンパイラ。こちらも人気がある。 - Gauche
実用指向のR5RS Schemeの処理系。バイトコードインタプリタ。開発者が日本人。多言語化と軽快さ、組み込みやすさ、実用的な付属ライブラリが特徴。 - Mosh
比較的高速なR6RS Schemeの処理系。バイトコードインタプリタ。作者はひげぽん(MonaOSの作者) - Clojure
Clojureの処理系。Javaバイトコードコンパイラ。 - Arc
Arcの処理系。MzScheme上で動作する。 - 魔法言語 リリカル☆Lisp
ニコ厨…というかラノベ好きにはとっつきやすいLisp(Schemeライク)処理系。 - Jakld.jar
Javaランタイムさえあればすぐ動く軽量のScheme処理系。開発は京都大学の湯淺太一教授。
色々バージョンがあるが、オススメは末尾再帰版+SICP図形言語環境を搭載したこちらのバージョン。なお、IE7だと勝手に拡張子が「.zip」に置き換わってしまうので注意。地味にiアプリ版も配付されている。Scheme処理系。
余談だがSICP3章で解説されている「cons-stream」関数は(activate-cons-stream)で動くっぽい。
(関 (連 '(動) 画))
ニコスクリプトを用いてLISP処理系(注:非常に重い)およびその解説。
また、Shibuya.lisp(渋谷を中心としたLispコミュニティ)で定期的に開催されているテクニカルトークの様子をニコニコ動画で見ることができる。
(((か ん) (れ () ん)) (し '('(ょ) '(う) '(ひ) '()) '(ん)))
(関 (連 (項 '(目))))
- プログラミング言語
- プログラミング関連用語の一覧
- Scheme
- Clojure
- Emacs
- 関数型言語 / 高階関数 / ラムダ計算
- ガベージコレクション (Garbage Collection, GC)
- ポーランド記法
- もっとevalされるべき(evalはSchemeなど実用LISPにおける評価命令)
- 12
- 0pt