「Ansi Common Lisp」8章練習問題
1. 同一の名前をもつ2つのシンボルがeqlでないということはありうるか。
別パッケージで同一の名前ってのがあるので、ありうるが答えでしょう。
(defpackage "PACKAGE1" (:use "COMMON-LISP") (:nicknames "PKG1") (:export "WIN")) (in-package package1) (defun win (x) x) (defpackage "PACKAGE2" (:use "COMMON-LISP") (:nicknames "PKG2") (:export "WIN")) (in-package package2) (defun win (x) x) (defpackage "APP") (in-package app) (pkg1:win 2) (pkg2:win 2) (eql #'pkg1:win #'pkg2:win)
結果はこう。
* #<The PACKAGE1 package, 0/8 internal, 1/2 external> * #<The PACKAGE1 package, 0/8 internal, 1/2 external> * WIN * #<The PACKAGE2 package, 0/8 internal, 1/2 external> * #<The PACKAGE2 package, 0/8 internal, 1/2 external> * WIN * #<The APP package, 0/9 internal, 0/2 external> * #<The APP package, 0/9 internal, 0/2 external> * 2 * 2 * NIL *
2. "FOO"というストリングを表現するのに要する記憶容量とfooというシンボルを表現するのに要する記憶容量の差を推定せよ。
"FOO"は値だけ持つのに対し、シンボルのfooは、名前、パッケージ、変数の値、関数、属性リストを持つので、大体5倍ってところじゃないですかね。(いいかげん)
3. 123ページのdefpackageの呼び出しでは、引数にはストリングしか使わなかった。シンボルを使うこともできたのだが、これは危険なことがある。なぜか。
なんとなく循環参照問題とかが発生しそうな気もしたけど、よく分からない。そんなときは答え参照。
ほとんどの処理系でシンボルをサポートしているが ANSI 標準では文字列を引数として与えるように 定義されているから。 (see Common LISP Hyper spec
こういう答えでいいのだろうか?”なぜ”という問いはもっと本質的な答えを要求しているのだろうか?
ふーん、そうなのか。そういうもんなの?
4. 図7.1のコードが"RING"という名前のパッケージに属するようにするのに必要なコードを書き加えよ。同様に図7.2のコードが"FILE"という名前のパッケージに属するようにせよ。ただし、いずれも既にあるコードに変更は加えないものとする。
defpackageするだけなので省略。
5. ある一節がHenley(8.8節)で生成されたものであるかどうかを判別できるプログラムを書け。
6. Henleyが、単語を引数として、中央にその単語を含む文を生成するように書き換えよ。
ギブアップにつきパス(こんなのばっか)
この章の練習問題はほとんどできなかったなあ。。