なんだこれは

はてなダイアリーから移転しました。

複数ファイルから成る、小さいプロジェクトのメモ

quicklisp で 小さいプロジェクトのメモを書いたので実際のプロジェクトを書いてみたメモ

前回 ~/.config/common-lisp/source-registry.conf.d/ フォルダにファイルを置いて、
asd ファイルのサーチパスに ~/lisp 以下のフォルダを再帰的に追加した。
ここに、junk という hello world プログラムを置いてみる。

asd ファイルと、呼出し側caller.lisp と 関数定義 callee.lispになる。

;;;; this is a part of junk program (~/lisp/junk/caller.lisp)

(in-package :common-lisp)

(defpackage junk.caller
  (:use :common-lisp
        :junk.callee))
(in-package :junk.caller)

(hello-world)

このin-package から in-package までがファイルの読み込み順を決定する情報になる。
このcaller.lisp の junk.caller パッケージは junk.callee を読みこまなければならない。

;;;; this is a part of junk program (~/lisp/junk/callee.lisp)

(in-package :common-lisp)

(defpackage junk.callee
  (:use :common-lisp)
  (:export :hello-world))
(in-package :junk.callee)

(defun hello-world ()
  (print "Hello, World!"))

これが関数定義側 で hello-world 関数をエクスポートしている。エクスポートしているから、呼出し側では、パッケージ名の修飾なしで呼出しができる。

;;; this is a part of junk program (~/lisp/junk/junk.asd)

(defsystem "junk"
  :components ((:file "callee")
               (:file "caller"))
  :serial t)

これが asd ファイルで junk システムが定義されている。ここはよくわかっていないので要調査か。:depends-on で依存するパッケージを指定できる。

ここまで作成したら、asdのサーチパスに含まれているので common lisp の clozure clを起動して、quicklispで読み込みができるはず。

CL-USER> (ql:quickload :junk)
To load "junk":
Load 1 ASDF system:
junk
; Loading "junk"
[package junk.callee]...........................
[package junk.caller]
"Hello, World!"
(:JUNK)
CL-USER>

できた。