myaosato/myaosato.github.io

Default value of :USE for DEFPACKAGE is implementation dependent.

Closed this issue · 5 comments

この状態ではcl:in-packageがパッケージFOOにinternされていないからです.

DEFPACKAGEに:USEがない場合は処理系依存です。

可搬的に:CLを使わないPACKAGEを定義したい場合は明示的に(:USE)と指定すればokです。

ちなみに処理系は何をお使いでしょうか?

FOO> (defun + (&rest numbers) (declare (ignore numbers)) 0)
WARNING: redefining COMMON-LISP:+ in DEFUN
+

これも処理系によりけりで、PACKAGE-LOCK機構を持つ処理系ならエラーになるようです。
(具体的には少なくともSBCLではエラー。)

なるほど。そうなんですね。ありがとうございます。

:useの件、うまく書き直す事考えます。

PACKAGE-LOCK機構に関する部分は、私の考慮漏れです。
書き直そうと思います。

処理系はSBCL使ってます。(手元で試した時に何も考えずにエラーを解消させてしまっていた。

重箱の隅をつつくようなissueで心苦しくもあったのですがパッケージに関する記事は少ないのが実情かと思います。
実践Common Lispにも

いったん慣れてしまえば、パッケージについて考えることは少なくなるだろう。
考えるべきことも多くない。
それでもパッケージには、新人Lispプログラマが実際よりも複雑でとっつきにくいと思わせるような悩みどころがいくつかある。

とある通り、喉元過ぎれば熱さを忘れるというやつで、何が分からなかったのか分からなくなるので記事にしづらいという側面もあるかと存じます。

今回の記事はこのツイートを受けてのものと思っています。
私も触発されて書きました
逆引きCommon Lispが更新されたのも同様のツイートが原因と思ってます。

なんだかんだでパッケージは分かりにくいものかと思うので、異なる視点による記事が増えるのはコミュニティにとって大変有益かと思っております。
ありがとうございました!

不完全だとは思いつつ、とりあえず注記をしました。

わかりやすさを考えて、記事の構成も変えようかと思っているので、
今日明日また書き直し作業するとは思いますが、とりあえず。

c40791d

書き直ししてたり、くたばってたりしてたら、ちょっと時間がかかりそうなので、来週末くらいまでに頑張るということで。

他の方からの指摘も取り入れて、書き直しました。

また不備があったら、教えてもらえると助かります。

defpackageのオプションはまだ書いてませんが、一度このIssueはcloseします