provideとrequire

ちょっと自信ないけど、一応。
CommonLispではrequireは同じファイルは一度しかロードしないと定義されている。
ただし、その機能を使うにはrequireされるファイルでprovideしている必要がある。
例えば、

;; foo.lisp
(provide "foo")

(defun f(x) x)

というfoo.lisp

;; bar.lisp

というbar.lispを用意する。
ほいで、インタプリタでロードしてみると、

> (require "foo")
$ clisp
(中略)
[1]> (require "foo")
;; Loading file /Users/mzp/Workspace/ldoc/foo.lisp ...
;; Loaded file /Users/mzp/Workspace/ldoc/foo.lisp
T
[2]> (require "foo")
NIL
[3]> (require "bar")
;; Loading file /Users/mzp/Workspace/ldoc/bar.lisp ...
;; Loaded file /Users/mzp/Workspace/ldoc/bar.lisp
T
[4]> (require "bar")
;; Loading file /Users/mzp/Workspace/ldoc/bar.lisp ...
;; Loaded file /Users/mzp/Workspace/ldoc/bar.lisp
T

となる。