M.Hiroi's Home Page

Common Lisp Programming

[ Home ]

WHAT'S NEW

CONTENTS


お気楽 Common Lisp プログラミング入門

CONTENTS


はじめに

LISP (リスプ, 名前は list processor に由来) は、1958 年にジョン・マッカーシー氏 (John McCarthy) によって開発された「関数型言語」の元祖で、「ラムダ計算」という数学の理論に基づいた言語です。LISP は記号処理が得意な言語で、コンピュータが数値計算だけではなく、他の分野に応用できることを示した最初の言語といえます。人工知能の研究や数式処理といった分野で使われていましたが、他の分野でも活躍しています。現在、ユーザが一番多い処理系はエディタ Emacs に搭載されている Emacs Lisp ではないでしょうか。

LISP は時代とともに変化し、いろいろな言語に影響を与えてきました。たとえば、今では Java やスクリプト言語で当たり前のように使われている機能、不要になったメモリを自動的に回収する「ガベージコレクション (garbage collection)」は LISP で培われた技術です。また、たいていのスクリプト言語で実装されている「クロージャ (closure)」という機能も LISP から取り入れたものです。

LISP は今でも現役の言語です。言語仕様がきれいでコンパクトにまとまっている Scheme と、いろいろな方言に分かれていた LISP を標準化するために制定された Common Lisp という仕様が有名です。知名度は少々劣りますが、ISO (International Organization for Standardization, 国際標準化機構) が 1997 年に策定した ISLisp という仕様もあります。

Common Lisp は 1994 年に ANSI によって標準化されました。この規格 ANSI INCITS X3.226-1994 (R2004) のことを ANSI Common Lisp といい、処理系のことを Common Lisp と呼ぶこともあります。ANSI Common Lisp に準拠した処理系は多数開発されていますが、フリーで有名なところでは CLISP や Steel Bank Common Lisp (SBCL) などがあります。

本稿では、簡単なプログラムを作りながら Common Lisp の基本をゆっくりと解説していこうと思っています。基本的には拙作のページ xyzzy Lisp Programming / Common Lisp 入門 をなぞっていきますが、ANSI Common Lisp に合わせた加筆や修正を行おうと思っています。いつものように、お気楽なページにしかなりませんが、興味のある方はお付き合いくださいませ。

●SBCL のダウンロード

本稿では処理系に Steel Bank Common Lisp (SBCL) を使用することにします。SBCL は次のサイトからダウンロードできます。

SBCL は Windows 用のバイナリが用意されているので、簡単にインストールすることができます。Windows の最新版は version 1.4.14 です (2020 年 1 月)。Linux 系 OS の場合、パッケージ管理システムを使ったほうが簡単でしょう。Ubuntu であれば、次のコマンドで SBCL をインストールすることができます。

sudo apt install sbcl

Ubunts 18.04 (Windows Subsystem for Linux) の場合、sbcl version 1.4.5 がインストールされます (2020 年 1 月)。

●プログラムの実行

シェル (Windows であれば cmd.exe, Unix 系 OS であれば bash など) でコマンド sbcl を実行すると、メッセージとプロンプト * が表示されて SBCL が起動します。

$ sbcl
This is SBCL 1.4.5.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
*

この状態で Lisp のプログラムを入力して簡単に実行することができます。これを REPL (read - eval - print - loop, 対話モードのこと) といいます。終了する場合は (quit) と入力してください。Unix 系 OS であれば CTRL-D を入力しても終了することができます。

REPL でソースファイル source.lisp を読み込むときは (load "source.lisp") とします。Common Lisp の場合、拡張子は .lisp が一般的です。このほかに、.lsp や .l が使われることもあります。sbcl の起動時にソースファイルを読み込みたい場合はオプション --load で指定します。

sbcl --load source.lisp

オプション --script を指定すると、sbcl をスクリプト言語のように使うこともできます。

sbcl --script source.lisp

source.lisp を読み込んでプログラムを実行したあと sbcl を終了します。

なお、Windows 版 SBCL はコマンドラインの編集やコマンド履歴をたどることができますが、Ubuntu 版はそのままではできません。この場合、rlwrap をインストールすると便利になります。

sudo apt install rlwrap

あとはシェルで rlwrap sbcl を実行するだけです。簡単なプログラムであれば、これだけでもかなり便利になります。

●簡単なベンチマーク

SBCL はプログラムをネイティブコードにコンパイルする処理系です。REPL から入力されたプログラムもコンパイルしてから実行されます。その実行速度ですが、拙作のページ Algorithms with Python 再帰定義 の「たらいまわし関数」を使って調べてみました。

リスト : たらいまわし関数 (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))))

それでは実行結果を示します。(tak 22 11 0) を計算しました。実行時間は (time (tak 22 11 0)) で計測できます。

表 : tak(22, 11, 0) の結果
処理系
Python (ver 3.6.9)69.6
Lua (ver 5.3.3)37.2
Ruby (ver 2.5.1p57)25.4
Gauche (ver 0.9.9)25.3
ocamlc (ver 4.05.0)10.8
SBCL (ver 1.4.5)6.38
LuaJIT (var 2.1.0-β)4.02
Julia (ver 1.3.0)2.02
SBCL (最適化)1.57
GCC -O2 (ver 7.4.0)1.23
ocamlopt (ver 4.05.0)0.97

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 を指定しただけなので、他のオプションを指定するともう少し速くなるかもしれません。興味のある方は、ほかのプログラムでも試してみてください。


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

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

Copyright (C) 2020 Makoto Hiroi
All rights reserved.

Common Lisp 入門:番外編

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

CONTENTS

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

パズルの解法

Yet Another Common Lisp Problems


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

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

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

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

CONTENTS

●履歴


はじめに

Common Lisp には CLOS (Common Lisp Object System) というオブジェクト指向システムがあります。CLOS はC++や Java とはちょっと違ったオブジェクト指向で、とても興味深いシステムです。ANSI Common Lisp に準拠した処理系であれば CLOS を利用することができます。処理系は多数開発されていますが、フリーで有名なところでは CLISP や Steel Bank Common Lisp (SBCL) などがあります。

本ページでは、SBCL を使って簡単なプログラムを作りながら、CLOS の基本を勉強していきたいと思っております。なお、本ページは M.Hiroi の「覚え書」にすぎません。勘違いや間違いなどもあると思います。何かお気づきの点がありましたら、メールでご指摘いただけると助かります。たいしたことはできませんが、よろしければお付き合いくださいませ。

ところで、Common Lisp は初めてという方は、まず最初に お気楽 Common Lisp プログラミング入門 をお読みください。Common Lisp の基本を詳しく説明しています。


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

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

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

参考文献, URL

●参考文献

  1. Patrick Henry Winston, Berthold Klaus Paul Horn, 『LISP 原書第 3 版 (1) (2)』, 培風館, 1992
  2. Guy L. Steele Jr., 『COMMON LISP 第 2 版』, 共立出版, 1991
  3. 黒川利明, 『LISP 入門』, 培風館, 1982
  4. Ravi Sethi (著), 神林靖 (訳), 『プログラミング言語の概念と構造』, アジソンウェスレイ, 1995
  5. 小暮裕明, 『オブジェクト指向のすべて』, CQ出版社, 1990
  6. B.J.コックス, A.J.ノボビルスキ, 『オブジェクト指向のプログラミング』, トッパン, 1992
  7. 井田昌之, 『new はやわかり Java』, 共立出版, 1997
  8. Bjarne Stroustrup (著), 『プログラミング言語C++ 第 3 版』, アジソンウェスレイ, 1998
  9. まつもとゆきひろ, 石塚圭樹, 『オブジェクト指向スクリプト言語Ruby』, 株式会社アスキー, 1999

●参考 URL

  1. Common Lisp HyperSpec, (LispWorks)
  2. Common LISP users jp
  3. 逆引き Common Lisp
  4. Lisp - Wikipedia
  5. Common Lisp - Wikipedia

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