モンスターコアの作り方 — #:g1

Posted 2011-02-06 08:59:00 GMT

自分はできるだけ沢山ライブラリを読み込んだコアを作り、その中で作業するのが好きなのですが、Quicklispを使いつつモンスターコアを作る方法を模索しています。
そんな感じの模索をメモ

下準備

- asdf2を利用します。
- Quicklispが管理するものは、Quicklispに任せて、Quicklispに登録されていないものは、
/l/src/
などの下に置くことにしてみます。ここで、/l/srcは、asdf.confで
(:tree "/l/src/" )
として、ディレクトリ以下に置かれたものは全部読まれるようにしておきます。
- 処理系は、SBCLを利用します

ライブラリの読み込み

モンスターコアを作成する際は、なんといってもライブラリを沢山読み込むのでロードのエラーの対策が面倒なのですが、ばっさり無視すると大分楽になります。
asdf2では、MAP-SYSTEMSで登録されたライブラリ(モジュール?システム?)を総なめにできるようなので、それを使って全部読み込みます。
(asdf:map-systems
 (lambda (x)
   (when (nth-value 1
                    (ignore-errors
                      (asdf:load-system (asdf:component-name x))))
     (format t "~80@{=~}~%" t)
     (format t "Load failed: ~A~%" (asdf:component-name x))
     (format t "~80@{=~}~%" t))))
これで大体は読み込めました。
※ちなみに、実際のところ、この方法で、全部のasdファイルを読んでくれてはいないようなのですが、正しい方法をご存じの方は教えてください。
ライブラリが読み込まれたので、イメージをダンプします。
(progn
  (setq sb-impl::*default-external-format* :utf-8)
  (pushnew (lambda ()
             (in-package :g000001)
             (swank::create-server :port 4005 :dont-close 'T))
           sb-ext:*init-hooks*)
  (sb-ext:save-lisp-and-die (format nil "/l/swank-sbcl-~A" (lisp-implementation-version))
                            :purify 'T :executable 'T))
SBCLの場合は、sb-ext:*INIT-HOOKS*に起動時に呼び出す関数を登録できるので、ここでSWANKを起動させます。
また、
(in-package :g000001)
というのは、自分用のcl-userパッケージのようなものです。
上記のようにすると、/l/swank-sbcl-1.0.45
のような実行可能ファイルができるので、実行すると、SWANKサーバーが起動します。
あとは、SLIMEからSWANKサーバーに、slime-connect等で接続すればOKです。
※M-x slimeで起動させる場合には、swank:CREATE-SERVERはしないバージョンを作成しておいて、SLIMEのslime-lisp-implementationsに登録すればOKではないでしょうか(多分)

自分の場合は、さらに読み込んでくれなかったライブラリを手動で追加したりしています。
そんなこんなで、現在パッケージ数:954、大きさ、419MBのイメージができました。めでたしめでたし。

comments powered by Disqus