トレース
もし、複数の人がLISPのプログラムをただ乱雑に作っていけば、そのプログラムは このような「似ているけど少し違う」関数の集合になってしまう。LISPに限らず、 どのようなプログラム言語を使ってもこの状況は変わらない。
このような状況では、
そこで、プログラムを作る時に、
データ構造は構造体によって読みやすいインタフェースを持つことができた。 では、LISPの関数自身はどうだろうか? 例え、defstruct がたくさんあって データ構造が見やすくなっても、わけわからない関数が雑多に転がっている だけでは困ってしまう。
+cw03+kono gcl
GCL (GNU Common Lisp) Version(2.2) Mon Mar 25 03:35:04 1996
Licensed under GNU Public Library License
Contains Enhancements by W. Schelter
>*package*
#<"USER" package> 普段はこのパッケージにいる
>(in-package 'kono) konoというパッケージを作る
#<"KONO" package>
KONO>(export '(kono-1 kono-2 kono-3)) この名前は外から見える
T
KONO>(defun kono-1 (x) (+ x 1))
KONO>(defun kono-2 (x) (+ x 2))
KONO>(defun kono-3 (x) (+ x 3))
KONO>(defun kono-4 (x) (+ x 4))
KONO>(in-package 'user) もとのuserパッケージに戻る
#<"USER" package>
>(kono-1 3) たしかに見えない
Error: The function KONO-1 is undefined.
>(kono:kono-1 3) こうすれば見える
4
>(kono:kono-4 4)
Error: Cannot find the external symbol KONO-4 in #<"KONO" package>.
>(kono::kono-4 4) :: はいんちきくさい
8
>(use-package 'kono) パッケージkonoを使う
Error: Cannot use #<"KONO" package> だめだ (X_X)
from #<"USER" package>,
because KONO:KONO-1 and KONO-1 will cause
a name conflict.
>(in-package 'kono-1) 真っ白なパッケージでもう一度
#<"KONO-1" package>
KONO-1>(use-package 'kono)
T
KONO-1>(kono-1 1) : を付けなくても使える
2
KONO-1>(kono-4 3) exportされてないものは使えない
Error: The function KONO-4 is undefined.
これによって、雑多な関数がある状況でも、安心してプログラムを行う
ことができる。
しかし、これは消極的な方法だともいえる。これだと衝突は少なくなるが、
同じような関数をたくさん作ったり、ちょっとづつ違うインタフェースを
持つ関数を作ってしまうことは、むしろ奨励しているようなものだ。
プログラム全体の構造を見通し良くするには、これらの小手先の
プログラム言語機能ではだめで、プログラムの作り方そのものを
考えていかなければならない。
構造化技法は