ryos36の日記 (Scheme Switch)

2008-01-27

cl-ppcre

00:32

つかってみる。lisp ぽくないきもするが便利。

clisp

00:32

sbclasdf がはじめから入っているのでらく。しかし、取り扱いは clisp の方が楽。readlineラッパーをつかえば sbcl も快適になるかもしれない。それより slime 入れたほうがいいのか?

まぁとにかく clispcl-ppcre を使いたい。

(load "/usr/local/lib/common-lisp/asdf/asdf.lisp")

いくつかのウェブページに path-to-asdf.lisp という記述があるがどうやら間違い。/path/to/asdf.lisp という最初の記述が誤って伝播している模様だ。

FreeBSD で (asdf:oos 'asdf:load-op 'cl-ppcre) としてもエラーになる。どうやら cl-ppcre/load.lisp 内のppcre-tests がインストールされてない模様。tests はなくてもよさそうなので、load.lisp から削除し、毎回コンパイルされるのもいやなので root で一度ロードしてコンパイルしておいた。

core のロードセーブ

00:32

sbcl で毎回 cl-ppcre をロードすると遅い。core を作ることで劇的(というほどでもないか)に早くなった。

(progn
  (require :asdf)
  (require :asdf-install)
  (require :sb-sprof)

  (require :cl-ppcre)

  (pushnew :michaelw-core *features*)
  (save-lisp-and-die "/tmp/test.core"))

clisp では

(ext:saveinitmem "lispinit.mem")

cl-ppcre を予め core に登録したかったので

(asdf:oos 'asdf:load-op 'cl-ppcre)
(ext:saveinitmem "lispinit.mem")

実行は lisp -M lispinit.mem か --norc をつける。わたしは -E EUC-JP -q もつけている。

コアのセーブとか SmallTalk みたいだな。

おまけ

(setf *tp* "\\[\\[([^\\[\\]]+)\\]\\]")

(defun my-make-list (str &optional (i 0) (lst nil) &key (test *tp*))
  (multiple-value-bind (starti endi sub) (scan test str :start i)
    (if (null starti)
      (nreverse lst)
      (progn
        (setf lst (cons (list starti endi (subseq str (+ starti 2) (- endi 2)))
lst))
        (my-make-list str endi lst)))))