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

ClojureでL-99 (P20 指定した要素を削除)

| 21:31 | ClojureでL-99 (P20 指定した要素を削除) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P20 指定した要素を削除) - わだばLisperになる

1..∞ な遅延リストと、リストを対応付けて解いてみました。

fromは、pfcから拝借(pfcのことなのでHaskellとかが元ネタかも…)。

fromの中のiterateは、初期値に関数を適用して、その結果にまた関数を適用して…な遅延リストを作成します。

stepはオプショナルにしていますが、clojureの場合、オプショナル引数は、オプションがある場合とない場合を分けて記述します。この辺がCLとはちょっと違うところ。

(defn
  #^{:doc "P20 (*) Remove the K'th element from a list."
     :test (do (test= (remove-at [] 3) [])
               (test= (remove-at '(a b c d) -3)
                      '(a b c d))
               (test= (remove-at '(a b c d) 100)
                      '(a b c d))
               (test= (remove-at '(a b c d) 2)
                      '(a c d))) }
; ---------
  remove-at
; ---------
  ([coll pos]
     (if (empty? coll)
       []
       (mapcat #(if (= pos %1) [] (list %2))
               (from 1)
               coll))))

(defn from 
  ([start]
     (from start 1))
  ([start step]
     (iterate #(+ step %) start)))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20081009