#:g1: GOOでL-99 (P12 ランレングス圧縮の伸長)

Posted 2008-04-17 08:45:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
何となくDylanの書法を真似て書いてみました。DGは、CLのdefgeneric、Dylanのdefine genericです。
generic系で、対応するクラスと返り値のクラスを明示→個別をmethod系で定義、というのは、CLOS系では割と定番なのかもしれません。
GOOでは、let(def)は、タプルを指定することによって分割代入的なことが可能なので使ってみました。
それと、letはCL/Schemeでいうlet*なので若干注意が必要かもしれません。パラレルにしたい場合は、前述のタプルを使った方法で書く必要があります。
opfは、Arcのzap、TAOの!!のようなもので自己代入の書法です。(set x (op + _ 1) ) => (opf x (+ _ 1) )と書けます。

(decode '((4 a) (1 b) (2 c) (2 a) (1 d) (4 e)))
;=> (a a a a b c c a a d e e e e)
(decode #((4 a) (1 b) (2 c) (2 a) (1 d) (4 e)))
;=> #(a a a a b c c a a d e e e e)
(decode #[(4 a) (1 b) (2 c) (2 a) (1 d) (4 e)])
;=> #[a a a a b c c a a d e e e e]
(decode "4;a,1;b,2;c,2;a,1;d,4;e")
;=> "aaaabccaadeeee"

(dg decode (u|<seq> => <seq>))

(dm decode (u|<seq> => <seq>) (def res () ) (for ((item u)) (def (tup n item) item) (opf res (cat _ (repeat `(,item) n)))) (as (class-of u) res))

(dm decode (u|<str> => <str>) (let ((res "") (items (split u #\,))) (for ((x items)) (def (tup n item) (split x #\;)) (opf res (cat _ (repeat item (str-to-num n))))) res))


comments powered by Disqus