#:g1: lisp 1.5でL-99 (P09 連続して現われる要素を纏める)

Posted 2008-05-28 07:20:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
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))))
))

comments powered by Disqus