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-06-05

LISP1.5でL-99 (P10 ランレングス圧縮)

| 22:17 | LISP1.5でL-99 (P10 ランレングス圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P10 ランレングス圧縮) - わだばLisperになる

前回定義したMY-PACKを利用しつつ、MAPCARがないので、自作しました。LISP1.5ということで、引数の順番は逆に。

これまでLISP1.5がLISP1なのか、LISP2なのか全然気にしてませんでしたが、下のコードからすれば、LISP1のようですね。

;ENCODE ((a a a a b c c a a d e e e e))
;
;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; ENCODE
;
; ((A A A A B C C A A D E E E E))
;
;
; END OF EVALQUOTE, VALUE IS ..
; ((4 A) (1 B) (2 C) (2 A) (1 D) (4 E))

DEFINE((
(MAPCAR (LAMBDA (LST FN)
          (COND ((NULL LST) () )
                (T (CONS (FN (CAR LST)) 
                         (MAPCAR (CDR LST) FN))))))

(ENCODE (LAMBDA (LST)
          (MAPCAR (MY-PACK LST)
                  (QUOTE (LAMBDA (X)
                           (LIST (LENGTH X) (CAR X)))))))
))

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))))
))

2008-05-24

LISP1.5でL-99 (P08 連続して現われる要素を圧縮)

| 18:02 | LISP1.5でL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる

なんとなくポインタ操作系で。

compress((a a a a b c c a a d e e e e))
; FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
;COMPRESS
;
; ((A A A A B C C A A D E E E E))
;
;
; END OF EVALQUOTE, VALUE IS ..
; (A B C A D E)

DEFINE((
(COMPRESS (LAMBDA (LST)
            (PROG (L RES TEM)
                  (SETQ L LST)
                  (SETQ RES (LIST (GENSYM)))
                  (SETQ TEM RES)
              L   (COND ((NULL L) (RETURN (CDR RES))))
                  (COND ((NOT (EQ (CAR L) (CAR TEM)))
                         (PROG ()
                               (RPLACD TEM (LIST (CAR L)))
                               (SETQ TEM (CDR TEM)))))
                  (SETQ L (CDR L))
                  (GO L))))
))

2008-05-15

LISP1.5でL-99 (P07 リストの平坦化)

| 02:16 | LISP1.5でL-99 (P07 リストの平坦化) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P07 リストの平坦化) - わだばLisperになる

LISTPがないので自作。NILは空リストということで削除する方針で作成。

; FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
;FLATTEN
;
;((0 (1 ((((2 (((((3 (((4)))))))) 5))))) (6 (7 8) 9)))
;
;END OF EVALQUOTE, VALUE IS ..
;(0 1 2 3 4 5 6 7 8 9)

DEFINE((
(LISTP (LAMBDA (LST)
         (OR (NULL LST) (NOT (ATOM LST)))))

(FLATTEN (LAMBDA (LST)
           (COND ((NULL LST) () )
                 ((LISTP (CAR LST)) 
                  (APPEND (FLATTEN (CAR LST)) (FLATTEN (CDR LST))))
                 (T (CONS (CAR LST) (FLATTEN (CDR LST)))))))
))

2008-05-07

LISP1.5でL-99 (P06 回文的かを調べる)

| 18:41 | LISP1.5でL-99 (P06 回文的かを調べる) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P06 回文的かを調べる) - わだばLisperになる

LISP 1.5にも、EQと、EQUALがあって、いまいち使い分けが分かっていませんが、この文脈では、EQUALを使うべきなようです。

PALINDROMEP((X A M A X))

; END OF EVALQUOTE, VALUE IS ..
; *TRUE*


DEFINE((
(PALINDROMEP (LAMBDA (LST)
               (EQUAL (REVERSE LST) LST)))
))

2008-04-30

LISP1.5でL-99 (P05 リストを逆転させる)

| 04:41 | LISP1.5でL-99 (P05 リストを逆転させる) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P05 リストを逆転させる) - わだばLisperになる

今回も再帰と繰り返しバージョンを作ってみました。

REV((FOO BAR BAZ))
REV-ITER((FOO BAR BAZ))

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; REV
;
; ((FOO BAR BAZ))
;
;
; END OF EVALQUOTE, VALUE IS ..
; (BAZ BAR FOO)
;
;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; REV-ITER
;
; ((FOO BAR BAZ))
;
;
; END OF EVALQUOTE, VALUE IS ..
; (BAZ BAR FOO)

DEFINE((
(REV (LAMBDA (LST)
       (COND ((NULL LST) () )
             (T (APPEND (REV (CDR LST)) (LIST (CAR LST)))))))

(REV-ITER (LAMBDA (LST)
            (PROG (L ACC)
                  (SETQ L LST)
               L  (COND ((NULL L) (RETURN ACC)))
                  (SETQ ACC (CONS (CAR L) ACC))
                  (SETQ L (CDR L))
                  (GO L))))
))

2008-04-24

LISP1.5でL-99 (P04 リストの長さ)

| 01:37 | LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる

LISP1.5には標準でLENGTHがあるようです。(エミュレータには何故か無いのですが…。)

SIZEは、再帰版で、SIZE-ITERは、ループ版ってことで書いてみました。ちなみに、DEFINEのは一度に複数の定義が書けます。

SIZE((A B C D E F))
SIZE-ITER((A B C D E F))

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6
;
;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE-ITER
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6

DEFINE ((
(SIZE (LAMBDA (LST)
        (COND ((NULL LST) 0)
              (T (ADD1 (SIZE (CDR LST)))))))

(SIZE-ITER (LAMBDA (LST)
             (PROG (L CNT)
                   (SETQ CNT 0)
                   (SETQ L LST)
                L  (COND ((NULL L) (RETURN CNT)))
                   (SETQ CNT (ADD1 CNT))
                   (SETQ L (CDR L))
                   (GO L))))    
    ))

2008-04-15

LISP1.5でL-99 (P03 K番目の要素)

| 19:00 | LISP1.5でL-99 (P03 K番目の要素) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P03 K番目の要素) - わだばLisperになる

最初は<や>はLISPには存在していなくて、greaterp、lesspでした。

また、1+、1-は、add1、sub1でした。MacLISPや、Lispマシン位までは両方使えましたが、Common Lispで廃止されたようです。

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; ELEMENT-AT
;
; ((A B C D E) 3)

; END OF EVALQUOTE, VALUE IS ..
; C

DEFINE ((
(ELEMENT-AT (LAMBDA (LST K) 
              (COND ((NULL LST) () )
                    ((GREATERP 2 K) (CAR LST))
                    (T (ELEMENT-AT (CDR LST) (SUB1 K))))))
    ))

ELEMENT-AT((A B C D E) 3)

2008-04-14

LISP1.5でL-99 (P02 最後2つの要素)

| 20:37 | LISP1.5でL-99 (P02 最後2つの要素) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P02 最後2つの要素) - わだばLisperになる

下のコードの例では、セミコロンをコメント記号として評価結果を書いていますが、LISP 1.5はコメント記号は持っていないため(バッチ処理だから?)、実際にはコメントになりません。

また、前回、LISP 1.5は大文字と小文字を区別しないと書きましたが、区別しないのではなくて、大文字しか存在していないので区別できない、というのが正確かもしれません。

ソースファイルをBCDに変換してIBM7094エミュレータに読み込ませているのですが、この変換時に全部大文字に直してくれているようなので、エミュレータへの入力は混合でOKです。

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; LAST2
;
; ((FOO BAR BAZ QUUX))

; END OF EVALQUOTE, VALUE IS ..
; (BAZ QUUX)

DEFINE ((
(LAST2 (LAMBDA (LST)
         (COND ((GREATERP 3 (LENGTH LST)) LST)
               (T (LAST2 (CDR LST))))))    ))

LAST2((FOO BAR BAZ QUUX))

2008-04-13

LISP1.5でL-99 (P01 最後のペアを返す)

| 20:37 | LISP1.5でL-99 (P01 最後のペアを返す) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P01 最後のペアを返す) - わだばLisperになる

今年は、LISP生誕50年であり、色々やるなら、やはりLISP1.5は外せないだろう…、ということで…。

全部大文字で書いてますが、LISP 1.5も大文字と小文字は区別せず、エミュレータに読み込ませるソースは小文字で書いても大丈夫なので、大文字にする必要はありません。

気分というか趣味の問題ですね…。

; FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; LAST
;
; ((FOO BAR BAZ))
;
; END OF EVALQUOTE, VALUE IS ..
; (BAZ)

DEFINE((
(LAST (LAMBDA (LST) 
        (COND ((NULL (CDR LST)) LST)
              (T (LAST (CDR LST))))))
))

LAST((FOO BAR BAZ))