Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-29

DEFPACKAGEでパッケージ名を#:fooと書くのはなぜなんだぜ?

| 03:28 | DEFPACKAGEでパッケージ名を#:fooと書くのはなぜなんだぜ? - わだばLisperになる を含むブックマーク はてなブックマーク - DEFPACKAGEでパッケージ名を#:fooと書くのはなぜなんだぜ? - わだばLisperになる

comp.lang.lispで、A Question about DEFPACKAGE syntaxというDEFPACKAGEに関しての疑問の投稿があり結構面白いと思ったので、勝手にまとめてみることにしました。

内容はというと、defpackageでパッケージ名を"FOO"と書いたり、:fooと書いたり#:fooと書いたりするのはなんでなのでしょう、というもので、自分も前から疑問に思ってはいました。自分の理解では、defpackageはマクロなので、macroexpandしてみると

(defpackage #:foo (:use #:foo) (:export #:bar))
;==>
(EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
  (SB-IMPL::%DEFPACKAGE "FOO" 'NIL 'NIL 'NIL 'NIL '("FOO") 'NIL 'NIL '("BAR")
                        '("FOO") 'NIL 'NIL (SB-C:SOURCE-LOCATION)))

というように、名前は、(symbol-name :foo)的に展開されるので、"FOO"も、:fooも、#:fooも同じで#:fooだとキーワードパッケージにもインターンされないから潔癖症の人はこっちが好きなんじゃないか、とか思ってましたが、フォローの流れをみると大体それで合ってたようで良かったです。

  • Pascal Costanza氏
    • おいっすー!、#:fooも:fooも同じだけど、P-COSたんイン(ターン)されないので、#:fooはGCの対象になると思うお!
  • Edi Weitz氏
    • もともとの基本は、"FOO"だけれど、大文字をタイプするのが面倒なので:foo。#:fooという表記はキーワードの節約。以前は#:fooと書いていたが:fooの方が一文字少ないので、最近は:fooの方が好き。

などなど。その他、Common Lispの処理系が大文字なのが嫌なので、

(setf *print-case* :downcase)

してるよ、に対してのレスで、いや、

(setf (readtable-case *readtable*) :invert)

の方が良いんじゃね?等々、あまり関係のない流れも。