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 |

2009-10-08

謎のこだわり 'Tと()

| 00:22 | 謎のこだわり 'Tと() - わだばLisperになる を含むブックマーク はてなブックマーク - 謎のこだわり 'Tと() - わだばLisperになる

全く誰も興味がない話題だと思うのですが、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のソースは、

にありますので、興味のある方は覗いてみて下さい。

また、真相をご存知の方は是非教えて下さい!

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