M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/

Common Lisp Programming

[ Home | xyzzy Lisp ]

WHAT'S NEW

CONTENTS


CLISP について

CLISP は GNU GPL ライセンスで配布されている Common Lisp です。Windows 用のバイナリも用意されているので、簡単にインストールすることができます。CLISP からダウンロードのページへ複数のリンクが張られているので、適当なページからダウンロードしてください。 M.Hiroi は SourceForge の CLISP - an ANSI Common Lisp からダウンロードしました。

CLISP はプログラムをバイトコードにコンパイルする方式です。CMUCLSBCL のようなネイティブコードにコンパイルする処理系にはかなわないと思いますが、バイトコードにコンパイルする方式では速い方だと思います。実際に拙作のページ Memorandum 2000 年 10 月 24 日 の「たらいまわし関数」で実行速度を比較してみました。

リスト : たらいまわし関数 (Common Lisp)

(defun tak (x y z)
  (if (<= x y)
      z
    (tak (tak (1- x) y z)
         (tak (1- y) z x)
         (tak (1- z) x y))))

CLISP の場合、関数単位でコンパイルすることができます。(compile 'tak) としてください。これで tak をコンパイルすることができます。または、関数 compile-file でファイルをコンパイルし、関数 load でプログラムをロードすることもできます。たとえば、ファイル名を tak.lisp とすると、(compile-file "tak.lisp") で tak.lisp がバイトコンパイルされ、結果がファイル tak.fas に出力されます。次に (load "tak.fas") とすれば、バイトコンパイルされたプログラムをロードすることができます。

それでは実行結果を示します。(tak 18 9 0) を計算しました。実行時間は (time (tak 18 9 0)) で計測できます。使用した Common Lisp は CLISP ver 2.44 と SBCL ver 1.0.29 です。SBCL も Windows 用のバイナリが用意されているので、簡単にインストールすることができます。ただし、Windows 版 SBCL はまだ開発途中で、安定したバージョンはありません。ご自分の責任でご使用ください。

比較のため、Python, Ruby, Gauche (Scheme), C言語 (GCC) の実行結果を示します。GCC と SBCL 以外の処理系はプログラムをバイトコードにコンパイルするものです。

表 : tak 18 9 0 の結果
処理系
Python (ver 2.5.2)7.88
Ruby (ver 1.9,0)7.42
Gauche (ver 0.8.12)3.16
CLISP (ver 2.44)2.57
SBCL (ver 1.0.29)0.47
GCC (ver 3.4.4)0.19
SBCL (最適化)0.172

Common Lisp の場合、次のように関数単位でデータ型や最適化の指定を行うことができます。

リスト : たらいまわし関数 (Common Lisp, 最適化の指定)

(defun tak (x y z)
  (declare (type fixnum x y z)
	   (optimize (speed 3) (safety 0)))
  (if (<= x y)
      z
    (tak (tak (1- x) y z)
         (tak (1- y) z x)
         (tak (1- z) x y))))

最適化を指定することで SBCL が GCC よりも速くなるとは驚きました。GCC のコンパイルオプションは -O2 を指定しただけなので、他のオプションを指定するともう少し速くなるかもしれません。ちなみに CLISP の場合、最適化を指定しても実行速度はほとんどかわりませんでした。興味のある方は、ほかのプログラムでも試してみてください。

-- 改訂 --------
2010/10/03 たらいまわし関数の実行結果に SBCL (Common Lisp) を追加

Common Lisp 入門:番外編

Common Lisp 入門 の番外編です。このドキュメントは拙作のページで説明したデータ構造やアルゴリズムなどのプログラムを Common Lisp 用に加筆・修正したものです。内容は重複していますが、ご了承くださいませ。

CONTENTS

データ構造とアルゴリズム

パズルの解法

Yet Another Common Lisp Problems

『Common Lisp 入門:番外編』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『Common Lisp 入門:番外編』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2003-2015 Makoto Hiroi
All rights reserved.

お気楽 CLOS プログラミング入門

CONTENTS

2003 年 9 月 - 12 月 初出
2010 年 4 月 24 日 改訂

はじめに

Common Lisp には CLOS (Common Lisp Object System) というオブジェクト指向システムがあります。CLOS はC++や Java とはちょっと違ったオブジェクト指向で、とても興味深いシステムです。残念ながら xyzzy Lisp は CLOS をサポートしていませんが、CLOS を利用できるフリーの Lisp 処理系がいくつかあります。

その中で Windows でも動作する処理系に CLISP があります。この CLISP を使って、CLOS でオブジェクト指向を勉強しながらプログラミングを楽しもう というのが本ページの趣旨であります。まあ、実際に CLOS を使うのは M.Hiroi も初めてなので、少しずつですが勉強したことをこのページで公開できればいいなと思っています。お付き合いのほどよろしくお願いいたします。

ところで、Common Lisp は初めてという方は、まず最初に xyzzy Lisp Programming:Common Lisp 入門 をお読みください。Common Lisp の基本を詳しく説明しています。

『お気楽 CLOS プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『お気楽 CLOS プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2003-2010 Makoto Hiroi
All rights reserved.

参考文献

  1. Patrick Henry Winston, Berthold Klaus Paul Horn, 『LISP 原書第 3 版 (1) (2)』, 培風館, 1992
  2. Guy L. Steele Jr., 『COMMON LISP 第 2 版』, 共立出版, 1991
  3. 小暮裕明, 『オブジェクト指向のすべて』, CQ出版社, 1990
  4. B.J.コックス, A.J.ノボビルスキ, 『オブジェクト指向のプログラミング』, トッパン, 1992
  5. 井田昌之, 『new はやわかり Java』, 共立出版, 1997

Copyright (C) 2003-2015 Makoto Hiroi
All rights reserved.