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 |

2008-05-28

LISP1.5でL-99 (P09 連続して現われる要素を纏める)

| 16:20 | LISP1.5でL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる

GENSYMはマクロ登場より前に存在していたりします。

一体どういう経緯でLISPにGENSYMが導入されたのか興味があるのですが、それはさておき、番兵的にGENSYMを使ってみました。番兵にもGENSYMは便利ではあります。

そして、もう一つPROG2について考えたこと。

PROG2はPROGN系で、一番最初に導入されたもので、PROG2→PROG1 & PROGNと進化し、PROG2自体はあまり使われることはなくなってしまいました。

それで、どうして最初からNではなくて2なのかと、いうことなのですが、

(PROG2 式 (GO 〜))という使い方を想定していたのではないかと、ふと考えました。

式の部分で、状態を変更して、GOTOする、というような…。

(PROG () 式 (GO 〜))では、あくまでPROG式の内部でGOTOするだけなので、複数の式をまとめつつGOTOしたい、という場合には、ちょっと不便です。

今回本当は、PROG2を使いたかったのですが、エミュレータには、PROG2がないので、PROGで書くことになり、そんなことを考えたのでした…。

MY-PACK((A A A A B C C A A D E E E E))

;FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
;MY-PACK
;
; ((A A A A B C C A A D E E E E))
;
; END OF EVALQUOTE, VALUE IS ..
; ((A A A A) (B) (C C) (A A) (D) (E E E E E))
DEFINE((
(MY-PACK (LAMBDA (LST)
           (PROG (RES TEM L)
                 (SETQ L (REVERSE 
                          (CONS (GENSYM) LST)))
              L  (COND ((NULL L) (RETURN RES)))
                 (COND ((null tem) (SETQ TEM (CONS (CAR L) TEM)))
                       ((EQUAL (CAR L) (CAR TEM))
                        (SETQ TEM (CONS (CAR L) TEM)))
                       (T (PROG ()
                                (SETQ RES (CONS TEM RES))
                                (SETQ TEM (CONS (CAR L) () )))))
                 (SETQ L (CDR L))
                 (GO L))))
))