#:g1: 謎のこだわり 'Tと()

Posted 2009-10-07 15:22:00 GMT

全く誰も興味がない話題だと思うのですが、MacLISPのソースコードを眺めているとどういう訳か、NILという表記が少なく、()と書かれている割合が多いようです。
そして、Tは、クォートされて'Tと書かれていることが多い気がします。
どんな感じかというと

(DEFUN CHMP1 (X)                                ;"CHOMP" one function
       (SETQ DATA (GETL X '(EXPR FEXPR)) CFVFL () LAPLL () )
       (COMPILE X (CAR DATA) (CADR DATA) () () )
       (LAP-A-LIST (SETQ LAPLL (NREVERSE LAPLL)))
       (AND (COND ((SYSP X) 
                   (AND (SETQ DATA (GETL X '(EXPR FEXPR SUBR FSUBR LSUBR)))
                        (MEMQ (CAR DATA) '(EXPR FEXPR))
                        (SETQ DATA '(SUBR FSUBR LSUBR))))
                  ('T (AND (SETQ DATA (GETL X '(*EXPR *FEXPR *LEXPR SUBR FSUBR LSUBR)))
                           (MEMQ (CAR DATA) '(SUBR FSUBR LSUBR))
                           (SETQ DATA '(*EXPR *FEXPR *LEXPR)))))
            (SETQ DATA (CAR (GETL X DATA)))
            (PUTPROP X (CAR (REMPROP X DATA)) DATA)))
のような感じなのですが、condのelse節に'Tが使われていて、nilと書きそうなところも()です。
どうもMacLISPのメインメンテナだったJonL White氏が触ったところは、こういう風にNIL ⇒ ()、T ⇒ 'Tのスタイルで書かれているんじゃないかと思われ、全体として()の割合が多くなっている気がするのですが、一体どういう理由でこうなのかが謎です。
ちょろっとある更新記録にも
;;; 01/29/81 jonl - flushed (STATUS FEATURE MACAID) and NIL --> () 
;;;                 added special declaration for GRIND-MACROEXPANDED
;;; 05/25/78 jonl - Had GRINDEF and SPRINTER lambda-bind variable LINEL, and 
;;;                 removed all references to CONNIVER and PLANNER stuff.
;;;                 Flush "SGPLOSES" and NOARGS calls; flush GBREAK.
;;;                 Change "NIL" into "()".
などと書かれています。そんなに()が好きなのか。もしくは、NILが嫌いなのか。GRINDEFのファイルだけにプリティプリンタの挙動か。それとも単なる偶然か。
MacLISPのソースは、
-(http://www.softwarepreservation.org/projects/LISP/index.html#LISP_1.5/1.6/MACLISP_for_PDP-6/10_)
にありますので、興味のある方は覗いてみて下さい。
また、真相をご存知の方は是非教えて下さい!

ちなみに、Tにクォートを付けるのは真似してやってみたら割と癖になってしまい、自分がLISPを書き始めた頃から大体これで書くようになってしまいました。CONDのelse節に使うと目立つのが気に入ってますが、他に良いことは別にないです。あえて言うなら、クォートを付けると私の中ではブール値っぽさが増します。NILも全部()で書いてみたら何か発見があるのかもしれない…。

comments powered by Disqus