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

ClojureでL-99 (P16 周期Nで要素を間引く)

| 18:34 | ClojureでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる

このお題では、関数名がdropとなっているのですが、dropはClojureにも存在するので、my-dropとしています。

clojure/dropの動作としては、SRFIのdropと同じです。

Clojureの場合、名前空間を分けられるので、競合を防ぐことも可能だと思いますが、とりあえず今回は大元のdropも使っていて紛らわしいので、それはなしの方向で。

(defn 
  #^{:doc "P16 (**) Drop every N'th element from a list."
     :test (do (test= (my-drop [] 3) [])
               (test= (my-drop '(a b c d e f g h i k) -1)
                      '(a b c d e f g h i k))
               (test= (my-drop '(a b c d e f g h i k) 0)
                      '(a b c d e f g h i k))
               (test= (my-drop '(a b c d e f g h i k) 3)
                      '(a b d e g h k))) }
; ----
  my-drop
; ----
  ([coll n]
     (if (empty? coll)
       []
       (loop [coll coll, acc [] ]
         (if-let block (butlast (take n coll))
           (recur (drop n coll) (concat acc block))
           (concat acc coll))))))