ポイミスライムにもわかる Common Lisp

いや、ポイミスライムはどうかな

Common Lisp の特徴

Common Lisp の特徴をあげます。

前準備

処理系

もしあなたが Linux(特に Debian)をお使いなら、 CMUCL がお勧めです。 Debian のパッケージシステムを使えば簡単にインストールできます。
Debain を使っている場合は http://ww.telent.net/cliki/Debian にさまざまなパッケージの情報が書かれていますので、 参考にすると幸せになれると思います。
もしあなたが何らかの理由で CMUCL を使えないのなら、 CLISP がお勧めです。 Windows を使う場合の有力な選択枝です。 ただし、まだ Thread が実装されていません(現在実装中のようです)。
もしあなたがお金持ちなら、Franz社の Allegro CL がお勧めです。 商用 Lisp として圧倒的シェアを誇っています。

開発環境

Lisp ではとてもたくさんかっこを使います。 すぐにかっこの対応が分からなくなってしまいます。 それゆえにまた、適切な字下げをしないととても読めません。 ということで、かっこと字下げを管理してくれるエディタが必須です。
Emacs(Meadow)で ILISP を使用するのがよいでしょう。 補完機能等も使えてとても便利です。 ILISP に付いている ilisp.emacs を参考に設定を行ってください。
Allegro CL には Emacs-Lisp Interface があるのでそれを使うのもよいでしょう。

始め方

Emacs と ILISP の使用を前提とします。
CMUCL を立ち上げるには、Emacs で M-x cmulisp と入力します。 CLISP の場合は、M-x clisp-hs です。 Emacs のバッファにプロンプトが表示されます。 実際に、どんなプロンプトが表示されるかは処理系によって異なります。
Lisp はこの対話環境が基本です。対話環境はトップレベルともいいます。

対話環境

入力に対してすぐにこたえが返ってくるのは素晴らしいことです。

やっぱり、Hello World!

いにしえの作法にのっとり、"Hello World!" と表示するプログラムから始めます。
Lisp の文法は (関数名 関数の引数1 関数の引数2 ... 関数の引数n) のようになっています。 他の多くの言語が関数名の後に "(" があるのに対し、 関数名の前に "(" があります。
> (prin1 "Hello World!")
"Hello World!"
"Hello World!"
"Hello World!" が二つ表示されますが、 一つ目は関数 prin1 により表示されたもの、 二つ目は (prin1 "Hello World!") を評価した結果 (ここでは関数 prin1 の返り値)です。
このようにトップレベルでは入力されたものを評価しその結果を表示します。
プログラムを実行するのに特別な手順は必要ありません。 実行したいプログラムを入力するだけで、すぐに実行結果が返ってきます。

Lisp を電卓として使う

Lisp を電卓として使ってみましょう。
> (+ 2 3 1)
6
> (* 2 3)
6
> (/ 6 3)
2
> (* 1980 1.05)
2079.0
> (* (- (+ 2 3) 2) 2)
6
最後の例の様に引数に関数を使うこともできます。 また Lisp では非常によく使用されます。 これが Lisp がかっこだらけになる一つの原因です。
* は直前に評価した結果、** は二つ前に評価した結果、 *** は三つ前に評価した結果が束縛されています。 だからこのようなこともできます。
> (+ 1 2)
3
> (+ 1 1)
2
> (+ 2 2)
4
> (* * ** ***)
24
> *
24
(* * ** ***) は (* 3 2 4) になります。

型について

Lisp は動的型付けの言語です。 変数自体には型がなく、 C や Java のように変数の宣言をする必要もあまません。 ただし変数の値(オブジェクト)は自分の型を知っています。
> (setf x 3)
3
> (type-of x)
FIXNUM
> (setf x "hello")
"hello"
> (type-of x)
(SIMPLE-BASE-STRING 5)

Web サーバ

Lisp で書かれた Webサーバがいくつかあります。 その中でも Franz社の AllegroServe™ を LispWorks や CMUCL で動くようにした Portable AllegroServe™ がお勧めです。

DB 関連

UncommonSQL

GUI

Common Lisp 標準の GUI はありません。
ただし、GTK や TK を使うことはできるようです。

ちょっとしたサンプルコード

Hello World!
(print "Hello World!") 
数字をコンマ編集する
(format t "~:D" 1000000)
=> 1,000,000 
cat
(defun cat (file)
(with-open-file (in file)
  (loop for line = (read-line in nil nil)
    while line
    do (format t "~A~%" line)))) 
series を使った cat
(defun cat (file)
  (format t "~A" (collect 'string (scan-file file #'read-char))))
リストを出力する
(format t "~{~A~^, ~}" '(1 2 3 4 5))
=> 1, 2, 3, 4, 5 
join
(reduce #'(lambda (a b) (concatenate 'string a " " b))
  (list "Hello" "Lisp" "World!"))
=> "Hello Lisp World!" 
関数の中でその関数を再定義
(defun foo ()
   (print "hello")
   (defun foo ()
    (print "bye"))
   (foo)) 
数字を文字にする
(princ-to-string 123)
文字を数字にする
(parse-integer "123")
CLOSS
(defclass foo ()())
(defclass bar ()())
(defclass baz (bar)())
(defmethod hoge ((instance foo)) 
         (format t "~&foo")) 
(defmethod hoge ((instance bar))
         (format t "~&bar"))
(defmethod hoge :after ((instance baz))
         (format t " & baz!!"))
(mapcar #'hoge 
         (list (make-instance 'foo)
              (make-instance 'bar)
              (make-instance 'baz))) 

リンク

JLUG (Japan Lisp User Group) 日本Lispユーザ会
CLiki Lisp による Wiki のページです。情報が充実しています。
The Association of Lisp Users 英語のページです。
Common Lisp HyperSpec™ Common Lisp のドキュメント。とても役に立ちます。
On Lisp

戻る
ancient@s6.xrea.com