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-04-24

GOOでL-99 (P13 ランレングス圧縮 その3)

| 06:43 | GOOでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる

WikipediaでDylanの歴史の項目を眺めていたら、GOOの作者であるJonathan Bachrach氏は、Dylanの一番最初のフリーの実装を作った人だったらしく、GOOがDylanから影響を受けているというもの宜なるかな。

supはCLのcall-next-methodのようなもので、与えた引数に次に特定できるクラスのメソッドを適用します。

(encode-direct '(a a a a b c c a a d e e e e))
;=>  ((4 a) b (2 c) (2 a) d (4 e))
(encode-direct #[a a a a b c c a a d e e e e])
;=> #[(4 a) b (2 c) (2 a) d (4 e)]
(encode-direct #(a a a a b c c a a d e e e e))
;=> #((4 a) b (2 c) (2 a) d (4 e))
(encode-direct "aaaabccaadeeee")
;=> "4;a,b,2;c,2;a,d,4;e"

(dg encode-direct (u|<seq> => <seq>))

(dm encode-direct (u|<seq> => <seq>)
  (if (empty? u)
      u
      (let ((cnt 0)
            (prev (elt u 0))
            (res (packer-fab <lst>)))
        (for ((x `(,@(as <lst> u) ,(gensym))))
            (if (= prev x)
                (incf cnt)
                (seq 
                 (pack-in res (if (= 1 cnt) prev `(,cnt ,prev)))
                 (set cnt 1)
                 (set prev x))))
        (as (class-of u) (packed res)))))

(dm encode-direct (u|<str> => <str>)
  (join (map (fun (x) 
               (if (cons? x)
                   (let (((tup num item) x))
                     (cat (to-str num) ";" (to-str item)))
                   (to-str x)))
             (sup (as <lst> u)))
        ","))

(df cons? (u|<any> => <log>)
  (and (subtype? (class-of u) <lst>)
       (not (nul? u))))