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

GOOでL-99 (P09 連続して現われる要素を纏める)

| 04:23 | GOOでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる

今回も無駄にリストだけでなくコレクションクラスに対応してみました。

また、GOOでは、繰り返しの為の値の蓄積にpackerというものが使えるようなので使ってみました。

packer-fabでpakerのインスタンスを作成し、pack-inで蓄積、packedで蓄積結果を任意のクラスで返します。割とややこしい使い勝手。


(my-pack '(a a a a b c c a a d e e e e))
;=> ((a a a a) (b) (c c) (a a) (d) (e e e e))
(my-pack #(a a a a b c c a a d e e e e))
;=> #((a a a a) (b) (c c) (a a) (d) (e e e e))
(my-pack #[a a a a b c c a a d e e e e])
;=> #[(a a a a) (b) (c c) (a a) (d) (e e e e)]
(my-pack "aaaabccaadeeee")
;=> "aaaa,b,cc,aa,d,eeee"

(dm my-pack (u|<col> => <col>)
  (if (empty? u)
      u
      (as (class-of u) (my-pack1 u))))

(dm my-pack (u|<str> => <str>)
  (if (empty? u)
      u
      (join (map (op as <str> _) 
                 (my-pack1 u))
            ",")))

(df my-pack1 (u|<col> => <lst>)
  (let ((prev (1st u))
        (res (packer-fab <lst>))
        (tem (packer-fab <lst>)))
    (for ((x u))
      (unless (= x prev)
        (pack-in res (packed tem))
        (set tem (packer-fab <lst>)))
      (pack-in tem x)
      (set prev x))
    (pack-in res (packed tem))
    (packed res)))

;))))))))))