back

Common Lisp のメモ。


実行環境


インストールと設定

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.html

SLIME

http://www.math.s.chiba-u.ac.jp/~matsu/cl/index.html

Emacs の設定

http://www.math.s.chiba-u.ac.jp/~matsu/cl/index.html

パッケージを使う

「実践 Common Lisp」のソースのパッケージを使うために行ったこと。

以下は、3章の simple-database, 15章の pathnames, 付属している cl-ppcre を導入した時の記録です。


パッケージを作る

パッケージの使い方に慣れるために、適当に1個作った。

util-random.lisputil-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 を使ったサンプル


実践 Common Lisp

Paul Graham

http://www.paulgraham.com/index.html

Last modified: Sun Apr 19 00:53:27 JST 2009
Copyright (C) 2009 Kazushi NODA All Right Reserved.

Valid HTML 4.01 Transitional Valid CSS