[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:00528] Re: info



こんにちは。逸見 です。

≫| ところで亀井さん、関数 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

Index Home