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

Posted 2008-04-23 21:43:00 GMT

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


comments powered by Disqus