package

Last modified: "2019/01/02 17:49:36"

Intro

パッケージというものをどう使うべきか、良くわからないまま使っていたので、 ML からそれらしいところを探して、(私が、特に疑問に思っていたあたりを)少しだけ拾ってみた。

とりあえず,リファレンスをしっかり読まないと。 → パッケージ
それから,ここも。 → Hiroi さんち


Table of contents


全部のシンボルを user パッケージに入れてしまってはダメなのでしょうか?

[xyzzy:01997](Tetsuya Kamei さん)より。


| ≫Q1. では、全部のシンボルを user パッケージに入れてしまってはダメなのでしょう
| ≫か。
| 
| 良いと思います。
| むしろそうするべきだと思うのですが。(私は)

駄目とは言いませんが、そうすべきとも思いません(^^; まあ、好きな
やり方でいいのではないでしょうか。一般的な各モードのように、ほ
とんどのシンボルを公開するような場合はパッケージを使う意味はほ
とんどないでしょう。逆に、compile とか cmuloop のようなほとんど
が内部関数の場合は使った方が便利なのではないかと思います。

| ≫Q2. Q1がよくないとすると、その理由はシンボル名の重複する危険性が大きいからで
| ≫しょうか。

そもそもパッケージシステムが考えられたのはその理由からです。

|               C++です
| 
| たぶん。----> 亀井さん

ですます。


| 恥かしながら、わたしの頭の中では、モジュールとパッケージという2つの概念が
| ごっちゃになっているようです。
| 正直いって、両者のちがいがよくわかりません。

本来の考え方では、

  モジュール: *.c など
  パッケージ: *.exe、*.dll など

に相当すると思います(たぶん)。Lisp システムという OS 上で全部の
プログラムが同じ名前空間を使ったら、そりゃ重複もするっちゅうねん。
するってーと、xyzzy 程度の規模ではパッケージなんざ必要ないとも
言えますね(^^;
    

個人的に作成した変数名や関数名はパッケージに登録するのが好ましいのでしょうか?

[xyzzy:06778](KAMEI Tetsuya さん)より。

| 2.他の方がお作りになられたプログラムを見てて思ったのですけど、個人的に
| 作成したマクロプログラムを公開しようとする場合、変数名や関数名はパッケー
| ジに登録するのが好ましいのでしょうか

登録されないようにしない限りは、必ずどこかのパッケージ
に登録されます。パッケージシステムは、他のものと名前が
重複しないようにするための仕組みなので、ユニークになり
そうなプレフィックスをつけたりすれば、あまり気にする必
要はありません。
    

自作マクロを editor パッケージに登録していいのかな?

[xyzzy:06796](KAMEI Tetsuya さん)より。

| 引っかかってるのが、自作マクロをeditorパッケージに登録していいのかな、
| ということなんです

editor パッケージからの export は、なるべくしない方が
無難でしょう。ユーザから見れば、普通に何もしていない状
態(user パッケージが使われる)と同じなので。

数個の関数で完結するようなものであれば user パッケージ
を使用して、それなりの規模で内部関数が多くあるような場
合には、独自のパッケージを使用すればいいのではないでし
ょうか。

| exportしたシンボルについては早い物勝ちで、後から名前がかぶるシンボルを
| 登録しようとした場合、エラーではじかれて登録されるのは防げるのでしょう
| が、internalなものについては後から登録した物で上書きされてしまうのです
| よね?

うーん、微妙に違うような気がしたり…。
    

editor パッケージ? lisp パッケージ?

[xyzzy:01896](Masahito Henmi さん)より。

ed (editor)パッケージにあれば、EmacsLispやMuleに由来するlisp関数で
lispパッケージにあれば、common-lispという規格書にのっているlisp関数に
由来するというやつです。  (CLtLとかってココで、よく見かけるでしょ。)
           Common Lisp the Languageとかいう規格書
    

名前が衝突するため、exportできません。何故?

[xyzzy:08552](YAMAMOTO Taizo さん)より。

Question

(setq *grep-directory-name-hook*
        #'(lambda () (car ed::*grep-directory-history*)))
(define-key  *global-keymap*  #\M-f    'grep-dialog )

しかし

「名前が衝突するため、exportできません:editer-grep-directory-name-hook*」

という表示が出力されます。
これなどは何が問題でこのように表示がなされるのでしょうか?

Answer

(setq ...)した段階では、*grep-directory-name-hook*というシンボル
がuserパッケージの中に登録されます。この後でgrep-dialogを使う段
階でgrepd.lを読み込みます。このときにeditorパッケージのシンボル
*grep-directory-name-hook*を他のパッケージから見えるようにexport
するのですが、それがuserパッケージのシンボルと重複してるので、
「重複してるからexportはできんよ」と怒られます。

.xyzzyやsiteinit.lにいろいろ書いておくと自分も知らないライブラリ
が読み込まれてて、結果的にうまく動いてることがあるので、調べるの
が大変ですよね