Common Lisp のメモ。
実行環境
- SBCL: 1.0.27
(Vine Linux 4.2 用の rpm) - CLISP: 2.41
- SLIME: CVS版
- Emacs: 22.2
- OS: Vine Linux 4.2
インストールと設定
SBCL
web で検索しているうちに、Vine 用の rpm を提供しているページを発見した。
http://www.math.s.chiba-u.ac.jp/~matsu/cl/sbcl.html以前は、Lispbox を入れて試していたのだが、上記ページの sbcl-1.0.27-ra1.i386.rpm をインストールして使うことにした。
「Programming in Emacs Lisp」を翻訳されていて、Emacs をさわり始めたころによく参照させていただいた。
CLISP, SLIME, Emacs の設定もあるので、以下リンクのみ。
CLISP
http://www.math.s.chiba-u.ac.jp/~matsu/cl/clisp.htmlSLIME
http://www.math.s.chiba-u.ac.jp/~matsu/cl/index.htmlEmacs の設定
http://www.math.s.chiba-u.ac.jp/~matsu/cl/index.htmlパッケージを使う
「実践 Common Lisp」のソースのパッケージを使うために行ったこと。
以下は、3章の simple-database, 15章の pathnames, 付属している cl-ppcre を導入した時の記録です。
-
~/.sbcl/systems に asd ファイルのシンボリックリンクを作った。
asd ファイルは、変数 asdf:*central-registry* に含まれるパス上に置く。
asdf:*central-registry* にパスを追加しても良い。
~/.sbcl/systems は初めから含まれていたので、~/.sbcl/systems にした。
ディレクトリ systems 自体は存在しなかったので作成した。simple-database.asd -> /home/user/../../Chapter03/simple-database.asd pathnames.asd -> /home/user/../../Chapter15/pathnames.asd cl-ppcre.asd -> /home/user/../../libraries/cl-ppcre-1.2.3/cl-ppcre.asd
-
~/.sbclrc に以下の設定をした。
これで、M-x slime すると、自動的にコンパイルされてパッケージが使えるようになった。
(require 'asdf) ;; chapter 3 (asdf:oos 'asdf:load-op :simple-database) (use-package :com.gigamonkeys.simple-db) ;; chapter 15 (asdf:oos 'asdf:load-op :pathnames) (use-package :com.gigamonkeys.pathnames) ;; cl-ppcre (asdf:oos 'asdf:load-op :cl-ppcre) (use-package :cl-ppcre)
パッケージを作る
パッケージの使い方に慣れるために、適当に1個作った。
util-random.lisp と util-random.asd を同じディレクトリに置く。
~/.sbcl/systems に util-random.asd のシンボリックリンクを作る。
~/.sbclrc に次の設定を追加する。
;; util-random (asdf:oos 'asdf:load-op :util-random) (use-package :alpha.kazu.util-random)
まだ、パッケージ名をどう指定するのか良く理解していないが、とにかく動作する。
CL-USER> (random-list 20) (19 19 7 13 2 15 7 4 12 12 4 16 18 13 6 16 0 0 16 12) CL-USER> (random-list 10 :type 'char) (#\s #\Y #\q #\K #\+ #\I #\9 #\D #\= #\!) CL-USER> (random-list 30 :type 'string) "6@1H5jAq0Ol#IVKOq8+Hw42#2rt4ua" CL-USER> #'list-maker ;The function LIST-MAKER is undefined. ; Evaluation aborted. CL-USER> (in-package :alpha.kazu.util-random) #<PACKAGE "ALPHA.KAZU.UTIL-RANDOM"> UTIL-RANDOM> #'list-maker #<FUNCTION LIST-MAKER>util-random.lisp
(defpackage :alpha.kazu.util-random (:use :common-lisp) (:export :random-list)) (in-package :alpha.kazu.util-random) (defparameter *char-list* '(#\! #\/ #\= #\+ #\: #\# #\, #\@ #\$ #\- #\% #\. #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)) (defun list-maker (n f) (loop for i below n collect (funcall f n))) (defun random-number (n) (list-maker n #'random)) (defun random-char (n) (list-maker n #'(lambda (_) (nth (random (length *char-list*)) *char-list*)))) (defun random-string (n) (concatenate 'string (random-char n))) (defun random-list (n &key (type 'number)) (case type (number (random-number n)) (char (random-char n)) (string (random-string n)) (t (error "Unknown key."))))util-random.asd
(defpackage :alpha.kazu.util-random (:use :common-lisp)) (in-package :alpha.kazu.util-random) (asdf:defsystem :util-random :name "util-random" :author "Kazushi NODA" :version "0.1" :licence "BSD" :description "Easy utility using random." :components ((:file "util-random")))
loop
loop を使ったサンプル