独学Common Lisp

いま、ふたたびのCommon Lispへ

概要

Common Lispはメタプログラミング可能なプログラミング言語です。「独学Common Lisp」では、Common Lispを学ぶ際の道しるべとなる考え方を以下の方々を主な対象として示します。

Common Lispについて

Common LispはGuy L. Steele Jr.によって編集された標準のLispです。(「標準の」という言葉はここではC言語のように米国国家規格協会(ANSI)によって策定された言語仕様(INCITS 226-1994)が存在することを意味して使用しています。)

Common Lispは複数のLispを統一することを目的として策定されました。Lispのアイディアは1956年にJohn McCarthyによって開発されました。主に米国MITで開発が進められ、MacLispやInterLispなどの実用的な言語に発展しました。

Lispの持つ言語的特性に着目した研究も並行して進められ、Guy L. Steele Jr.Gerald Jay SussmanによってSchemeが発表されました。これはCarl E. Hewittが考えたアクターモデルを理解するためのシンプルなLispとして策定されました。

MITのハッカーに愛され、様々な言語に派生したLispですが、米国では研究開発や産業界でも広く使われていたため、Lispのスポンサーであった米国国防高等計画局(DARPA)から統一を勧められ、Schemeの設計者で天才的なハッカーであったGuy L. Steele Jr.の手によって「Common Lisp the Language」が1984年に出版され、2nd Editionが1990年に出版されました。その間、並行して1986年にANSIのワーキンググループX3J13が召集され、ANSI Common Lispが1994年に策定されました。米国の天才的ハッカー達の英知を結集して作られたこの仕様は現在に至るまで変更されることなく、安定的な言語的基盤を提供し続けています。

LispとCommon Lispの歴史の詳細についてはCLHS: 1.1.2 Historyおよび"The Evolution of Lisp"(Guy L. Steele Jr. and Richard P. Gabriel)を参照してください。

Common Lispの実用例と適した分野

Common Lispは以下のようなプロジェクトで使用されています。

Common Lisp - Myths and LegendsにはCommon Lispが適した分野が記載されています。

逆に、"Hello World"を表示するプログラムのように、単純なソースコードを実行可能な形式にするときには他の言語よりも大きなリソースが必要になるので不利です。

Lispの都市伝説

前述のMyths and Legendsには誤解されやすい「神話」が掲載されていますので、私の意見を交えながら簡単に紹介します。

  1. Lispは遅い
  2. Lispは大きい
  3. Lispには配列がない
  4. Lispにはコンパイラーがない
  5. Lispは標準化されていない
  6. Lispは他のプログラムと話せない
  7. Lispの構文は苦痛だ
  8. Lispのガベージコレクタは遅い
  9. Lispは特別なハードウェアが必要だ
  10. Lispは高い

エディタと処理系

どのような言語であれ、プログラミングをするにはエディタと実装(処理系)が必要です。

エディタ

最低限、Common Lispの構文ハイライトと自動インデントを行えるエディタを用意してください。ユーザが多いのはGNU Emacsvimです。私はmacOSに付属のvimと自分でダウンロードしてインストールしたGNU Emacsを使い分けています。ちょっとした編集にはvimの方が便利ですが、インタラクティブに開発を行う場合はSLIMEという補助ツールが使えるGNU Emacsの方が便利です。

vimを使う場合は設定ファイル(通常はユーザのホームディレクトリにある.vimrcという隠しファイルです)に以下の記述をすることでLispの編集が容易になります。

syntax on
set nocindent
set lisp
let lisp_rainbow=1
set autoindent
set showmatch
set nobackup
set noswapfile
set autoread
set expandtab
set tabstop=2
set shiftwidth=2
set ignorecase
set smartcase
set incsearch
set wrapscan

最近はAtomを使用するユーザも多いかもしれません。atom-slimeなどを一緒に使用すると便利ですが、まだ動作がEmacsのSLIMEほど安定していないような印象を受けます。Emacs + SLIMEの設定方法は他のサイトにもたくさんあると思うので、そちらを参照してください。

処理系

フリーで使用することができる処理系は

などがあり、この順で使用者数が多いと思います。SBCLは商用に匹敵する速度を誇る高速なコンパイラですが、ソースコードを全てコンパイルしてから実行するため、エラーメッセージが分かりにくいです。開発段階では別の処理系を使用し、運用段階で速度が問題になればSBCLの使用を検討するという使い方が多いのではないでしょうか。また、開発も最も活発で更新も頻繁に行われています。

CCLはバランスの良い処理系で、開発段階はインタプリタ、運用段階はネイティブコンパイルという使い方ができます。ただ、32bit用と64bit用が分かれているため、特に64bit版を使用する場合はccl64を指定する必要があります。また、Mac App Storeからも簡単にインストールすることができますが、これはターミナルから起動することができず、専用のウィンドウで操作するため、Unix/Linuxの操作に慣れた場合は公式サイトからダウンロードして使うか、homebrewなどを使用してインストールします。

CLISPはGNU Common Lisp(GCL)とは別物ですので注意してください。CLISPは移植性の高いバイトコードコンパイラと使い勝手の良いインタプリタを備えており、2010年から更新が止まっていますが安定性の高い処理系として今でも使われています。速度はSBCLやCCLに譲りますが、矢印キーで履歴を遡ってコマンドを打つことができるのも大変便利です。世界初のWebアプリケーションと言われているYahoo! Storeは最初CLISPで実装されていました。また、C言語をベースに実装されているのでメモリの消費量が一番少ないです。(SBCLとCCLはベースだけC言語で実装され、主要部分はCommon Lisp自身で記述されています。)

Common Lispは標準化されているのでソースコードの移植性は高いですが、日本語の文字コードに関する処理やシステムと密接に結びついた処理、サードパーティ製のライブラリなどは特定の処理系に依存している場合もあります。運用段階においてはどの処理系を使うかを気にする必要がありますが、このサイトで使う分にはあまり気にする必要はありません。


Copyright © 2017- satoshiweb.net All rights reserved.