[xyzzy:00528] Re: info
- Subject: [xyzzy:00528] Re: info
- From: Masahito Henmi <henmi@xxxxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
こんにちは。逸見 です。
≫| ところで亀井さん、関数 Info でなく 関数 info という
≫| 名前にすると、なぜ名前が衝突していると怒られる
≫| のでしょうか?
≫(provide 'info) で user パッケージに info が intern されるので
≫すが、(in-package "editor") してから info を export すると、
≫editor パッケージの info を export しようとするため、名前が衝突
≫するからです(分かる?)。
≫(provide "info") にすれば大丈夫なはずです。
≫|分かる?
≫?????
≫逸見のだんなが出てくるまで待ちましょう。
パッケージは最初私もわからなくて、亀井さんに何度も質問したので^^;
いまだに完璧かどうかは、わからないけど、じゃあ一応解説。
パッケージにはexportされた空間と、そうでない空間(internal)がある。
system lisp editor user
(si) (ed)
+-------+ +-------+ +-------+ +-------+
| s-exp | | l-exp | | e-exp | | u-exp | <-外部(公開)
+-------+ +-------+ +-------+ +-------+
| s-int | | l-int | | e-int | | u-int | <-内部
+-------+ +-------+ +-------+ +-------+
通常userパッケージで仕事をしている。 userパッケージは
system, lisp, editor を利用すると宣言されているので(use-package)
s-exp, l-exp, e-exp, u-exp, u-int に登録されたシンボルが使える
ようになっている。
プログラムを書いて新しいシンボルが出てくると、u-intに登録される
------
しかし(in-package "editor") を実行後にシンボルを書くとe-intに
-----
登録される。
ここまでは、たぶん理解できると思うのですが、ちょっとややこしいのが
ここからでして... ^^;
以下のように書いてあるのをロードする際
(in-package "editor")
(export '(Info-first-menu-item ...中略....
Info ...中略.... ))
lispインタープリタは読み込み、実行、読み込み、実行と繰り返しているのですが、
1.(in-package "editor")を読み込む
2.(in-package "editor")を実行する。
→これから新しいシンボルが出てきたらe-intに登録する
3.(export '(Info-first-menu-item ...中略....
Info ...中略.... ))を読み込む
→ Info-first-menu-item や Info といった新しいシンボルは e-intに登録される。
4.(export '(Info-first-menu-item ...中略....
Info ...中略.... ))を実行する。
→ Info-first-menu-item や Info が e-intから削除され、e-expに登録される。
e-intからe-expに移動していると考えてください。
ただこの時、expされた空間に、だぶっている名前がないかどうかチェック
され、だぶっていたら、exportできないと怒られます。
(チェックの仕方は難しいので、私も理解できていません。互いにuse-package
されているかどうかが、微妙に効いてきているみたい。)
私も最初 exportで怒られまくっていたのですが、この3,4の実行過程が理解できて
からスッキリしました。
では以下のコードがなぜエラーになるか
(provide 'info) <-- u-intに登録される
(in-package "editor")
(export '(Info-first-menu-item ...中略....
info ...中略.... ))
→ infoが一度 e-intに登録され、 e-extにエクスポートされる時に、
userパッケージが use-packageしている集合...
s-exp, l-exp, e-exp, u-exp, u-int
の中で、ダブりチェックが行われ、ダブっているので、エクスポートできないよ
と言われているのだと、思います。
なので、亀井さんの指摘のように
(provide "info")
(in-package "editor")
(export '(Info-first-menu-item ...中略....
info ...中略.... ))
こうすれば問題なし。
------------------------------------------------------------
逸見雅人 Email henmi@xxxxxxxxxxxxx
Masahito Henmi