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-09-28

ClojureでL-99 (P11 ランレングス圧縮 その2)

| 14:37 | ClojureでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる

書くのを忘れてましたが、defnに:testを付けると定義した時点で:testの部分が実行されます。

ということで、適切なテストケースを付ければ、きっと便利だと思います。

ただ単にassertだけを書いたテストケースでは、最初に定義した時点で意図通り動かない場合、逆にいらっと来るかもしれません(笑)

また、lengthがないのはなんでだろうと思っていましたが、countという名前で存在していたことを発見。

うーん、確かにcountという名前も妥当ではありますが…。

length、len、size、count等、同じ機能でも方言によって色んな名前がありますね。

(defn
  #^{:doc "P11 (*) Modified run-length encoding."
     :test (do (test= (encode-modified '(a a a a b c c a a d e e e e))
                       '((4 a) b (2 c) (2 a) d (4 e)))
               (test= (encode-modified []) [])
               (test= (encode-modified [1]) [1]))}
; ---------------
  encode-modified
; ---------------
  ([coll]
     (if (empty? coll)
       []
       (map #(if (single? %)
               (first %)
               (list (count %) (first %)))
            (pack coll)))))

(defn single? [coll]
  (nil? (rest coll)))