ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「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
こういう答えでいいのだろうか?”なぜ”という問いはもっと本質的な答えを要求しているのだろうか?

P.Graham 著 ANSI Common LISP 練習問題解答

ふーん、そうなのか。そういうもんなの?

4. 図7.1のコードが"RING"という名前のパッケージに属するようにするのに必要なコードを書き加えよ。同様に図7.2のコードが"FILE"という名前のパッケージに属するようにせよ。ただし、いずれも既にあるコードに変更は加えないものとする。

defpackageするだけなので省略。

5. ある一節がHenley(8.8節)で生成されたものであるかどうかを判別できるプログラムを書け。

6. Henleyが、単語を引数として、中央にその単語を含む文を生成するように書き換えよ。

ギブアップにつきパス(こんなのばっか)

この章の練習問題はほとんどできなかったなあ。。