Clojure の シーケンスを python のスライスのように取り出す

(use 'clojure.contrib.test-is)

(defn slice
  ([coll start]
     (let [start (max start 0)]
       (drop start coll)))       
  ([coll start end]
     (let [start (max start 0)]
       (take (- end start) (drop start coll))))
  {:doc "Extract a subsequencet like a slice of python."
   :test #(are (= _1 _2)
               (slice [] 2 7) []
               (slice [1 2 3 4 5] 1) [2 3 4 5]
               (slice '(a b c d e f g h i k) 2 4) '(c d)
               (slice "abcdefg" 3) '(\d \e \f \g)
               (slice "abcdefg" 0 2) '(\a \b)
               (slice [1 2 3 4] 5) '()
               (slice [1 2 3 4] 3 0) '()
               (slice "abcd" -1 6) '(\a \b \c \d)
               (slice "abcd" -1 -3) '()
               (slice "abcd" -4 -1) '())})

ソース http://github.com/fatrow/hozumi-clojure/blob/master/utils.clj

下半分は、ただのテスト用の記述です.そこから大体動作が分かると思います。マイナス方向はあんま使わなそうなので入れませんでした。


参考
ClojureでL-99 (P18 範囲切り出し)
http://cadr.g.hatena.ne.jp/g000001/20081006/1223296309
http://tips.lisp-users.org/clojure/index.cgi?部分文字列を取り出す
うーん、↑のようにsubseqではできませんでした。以前はできていたのかも。