Skip to content

Instantly share code, notes, and snippets.

@deltam
Created January 14, 2011 22:36

Revisions

  1. deltam revised this gist Jan 15, 2011. 1 changed file with 105 additions and 84 deletions.
    189 changes: 105 additions & 84 deletions gistfile1.clj
    Original file line number Diff line number Diff line change
    @@ -1,46 +1,31 @@
    (ns intro-seq.core
    (:use [clojure.contrib seq]))

    ; Clojure初心者向けに覚えておくと便利なシーケンス操作関数を解説する
    ;; Clojure初心者向けに覚えておくと便利なシーケンス操作関数の使用例を列挙する

    ; 全部で16個
    ;; 1.2でclojure.coreに移動し、廃止予定(DEPRECATED.)になってるのもある

    ;; 全部で18個(DEPRECATEDは8個)

    ;; 使用頻度高そう系(4個)
    ;; たまに使うかも系(3個)
    ;; パズルを解くときに使うかも系(3個)
    ;; シーケンスをグループ分け系(4個)
    ;; 自己参照する遅延シーケンスをつくる系(2個)
    ;; とりあえず知っとけばいいんじゃね?系(2個)




    ;; 使用頻度高そう系(4個)

    ;find-first
    ;シーケンスの中から条件に合う最初の要素を返す
    ;
    (find-first #(> % 3) [1 2 3 4 5])
    ;=> 4
    (find-first #(Character/isLowerCase %) "Clojure")
    ;\l


    ;flatten
    ;階層構造のあるシーケンスを均す
    (flatten '((1 2 3) (4 5 6)))
    ;=> (1 2 3 4 5 6)


    ;frequencies
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素の出現回数を数える
    ;要素をkey,出現回数をvalueにしたマップを返す
    (frequencies [1 1 2 3 5 8])
    ;{8 1, 5 1, 3 1, 2 1, 1 2}
    (frequencies "clojure is cool")
    ;{\space 2, \c 2, \e 1, \i 1, \j 1, \l 2, \o 3, \r 1, \s 1, \u 1}

    ;group-by
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素に指定された関数を適用し、その結果が同じものをグループ化する
    ;関数の値をkey、vectorでグループ化したものをvalueにしたMapを返す
    (group-by #(* 2 %) [1 2 3 4 5])
    ;{2 [1], 4 [2], 6 [3], 8 [4], 10 [5]}
    (group-by odd? (range 10))
    ;{false [0 2 4 6 8], true [1 3 5 7 9]}


    ;includes?
    ;シーケンス内に要素あるか調べる
    (includes? [1 2 3 4 5] 4)
    @@ -52,6 +37,22 @@
    (includes? "clojure" \x)
    ;false

    ;flatten
    ;DEPRECATED. Prefer clojure.core version.
    ;階層構造のあるシーケンスを均す
    (flatten '((1 2 3) (4 5 6)))
    ;=> (1 2 3 4 5 6)

    ; positions
    ; 条件が真になる要素の位置のシーケンスを返す
    (positions #(> 4 %) '(1 2 3 4 5))
    ;(0 1 2)
    (positions #(= \c %) "clojure is cool")
    ;(0 11)



    ;; たまに使うかも系(3個)

    ;indexed
    ; シーケンスの各要素をインデックス付きのベクタに変える
    @@ -62,34 +63,33 @@
    (indexed "clojure")
    ;([0 \c] [1 \l] [2 \o] [3 \j] [4 \u] [5 \r] [6 \e])

    ;frequencies
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素の出現回数を数える
    ;要素をkey,出現回数をvalueにしたマップを返す
    (frequencies [1 1 2 3 5 8])
    ;{8 1, 5 1, 3 1, 2 1, 1 2}
    (frequencies "clojure is cool")
    ;{\space 2, \c 2, \e 1, \i 1, \j 1, \l 2, \o 3, \r 1, \s 1, \u 1}

    ;partition-all
    ;reductions
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンス要素を指定した個数ごとにまとめる
    (partition-all 2 '(1 2 3 4 5 6 7 8))
    ;((1 2) (3 4) (5 6) (7 8))
    (partition-all 3 '(1 2 3 4 5 6 7 8))
    ;((1 2 3) (4 5 6) (7 8))
    (partition-all 1 2 '(1 2 3 4 5 6 7 8))
    ;((1) (3) (5) (7))
    ; シーケンスの先頭から各要素までreduceした結果を返す
    ; rec-seqを使って実装されている
    (reductions (fn [r x] (+ r x)) [1 2 3 4 5])
    ;(1 3 6 10 15)
    (reductions (fn [r x] (* r x)) [1 2 3 4 5])
    ;(1 2 6 24 120)


    ;partition-by
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンスを条件ごとに切り分ける
    ; シーケンス要素に関数を摘要し、同じ結果が返る連続する要素をグループ化
    (partition-by #(> 3 %) '(1 2 3 4 5))
    ;((1 2) (3 4 5))
    (partition-by odd? (range 10))
    ;((0) (1) (2) (3) (4) (5) (6) (7) (8) (9))

    ;; パズルを解くときに使うかも系(3個)
    ;; パズルを解きたい時にはc.c.combinatoricsも見てみると楽になるかも

    ; positions
    ; 条件が真になる要素の位置のシーケンスを返す
    (positions #(> 4 %) '(1 2 3 4 5))
    ;(0 1 2)
    (positions #(= \c %) "clojure is cool")
    ;(0 11)
    ;rotations
    ;シーケンスの最初の要素を最後に持って行き、循環させたものを順番にシーケンス化
    (rotations [1 2 3 4])
    ;((1 2 3 4) (2 3 4 1) (3 4 1 2) (4 1 2 3))

    ;rand-nth(rand-elt)
    ;DEPRECATED. Prefer clojure.core/rand-nth.
    @@ -110,58 +110,79 @@
    (rand-nth "Clojure")
    ;\o

    ;shuffle
    ;DEPRECATED. Prefer clojure.core version.
    ;ランダムシャッフル
    (shuffle [1 2 3 4 5])
    ;(3 1 5 4 2)
    (shuffle [1 2 3 4 5])
    ;(3 4 5 2 1)
    (shuffle [1 2 3 4 5])
    ;(1 4 3 5 2)
    (shuffle [1 2 3 4 5])
    ;(4 3 2 1 5)



    ;; シーケンスをグループ分け系(4個)

    ;group-by
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素に指定された関数を適用し、その結果が同じものをグループ化する
    ;関数の値をkey、vectorでグループ化したものをvalueにしたMapを返す
    (group-by #(* 2 %) [1 2 3 4 5])
    ;{2 [1], 4 [2], 6 [3], 8 [4], 10 [5]}
    (group-by odd? (range 10))
    ;{false [0 2 4 6 8], true [1 3 5 7 9]}

    ;partition-all
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンス要素を指定した個数ごとにまとめる
    (partition-all 2 '(1 2 3 4 5 6 7 8))
    ;((1 2) (3 4) (5 6) (7 8))
    (partition-all 3 '(1 2 3 4 5 6 7 8))
    ;((1 2 3) (4 5 6) (7 8))
    (partition-all 1 2 '(1 2 3 4 5 6 7 8))
    ;((1) (3) (5) (7))

    ;partition-by
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンスを条件ごとに切り分ける
    ; シーケンス要素に関数を摘要し、同じ結果が返る連続する要素をグループ化
    (partition-by #(> 3 %) '(1 2 3 4 5))
    ;((1 2) (3 4 5))
    (partition-by odd? (range 10))
    ;((0) (1) (2) (3) (4) (5) (6) (7) (8) (9))

    ;separate
    ; シーケンスをfilterして取得したものと、それ以外を両方取得
    ; 奇数と偶数に分けてみる
    (separate odd? (range 10))
    ;[(1 3 5 7 9) (0 2 4 6 8)]



    ;; 自己参照する遅延シーケンスをつくる系(2個)

    ;rec-seq
    ; 自己参照するシーケンスを作る
    (take 10 (rec-seq self (lazy-cat (range 3) self)))
    ;(0 1 2 0 1 2 0 1 2 0)


    ;rec-cat
    ; 自己参照するシーケンスをconcatする
    ; 名前、初期値、
    (take 10 (rec-cat fibs [1 1] (map + fibs (rest fibs))))
    ;(1 1 2 3 5 8 13 21 34)
    ;http://clj-me.blogspot.com/2009/01/recursive-seqs.html


    ;reductions
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンスの先頭から各要素までreduceした結果を返す
    (reductions (fn [r x] (+ r x)) [1 2 3 4 5])
    ;(1 3 6 10 15)
    (reductions (fn [r x] (* r x)) [1 2 3 4 5])
    ;(1 2 6 24 120)

    ;rotations
    ;シーケンスの最初の要素を最後に持って行き、循環させたものを順番にシーケンス化
    (rotations [1 2 3 4])
    ;((1 2 3 4) (2 3 4 1) (3 4 1 2) (4 1 2 3))

    ;separate
    ; シーケンスをfilterして取得したものと、それ以外を両方取得
    ;奇数と偶数に分けてみる
    (separate odd? (range 10))
    ;[(1 3 5 7 9) (0 2 4 6 8)]

    ;; とりあえず知っとけばいいんじゃね?系(2個)

    ;seq-on
    ;任意の型を(seq ~)でシーケンスに変換できるように定義できるマルチメソッド


    ;shuffle
    ;ランダムシャッフル
    ;DEPRECATED. Prefer clojure.core version.
    (shuffle [1 2 3 4 5])
    ;(3 1 5 4 2)
    (shuffle [1 2 3 4 5])
    ;(3 4 5 2 1)
    (shuffle [1 2 3 4 5])
    ;(1 4 3 5 2)
    (shuffle [1 2 3 4 5])
    ;(4 3 2 1 5)


    ;fill-queue
    ; スレッド間で通信できる?(よく分からない)
    ; ↓でfill-queueの使用例が見れる
  2. deltam revised this gist Jan 14, 2011. 1 changed file with 14 additions and 2 deletions.
    16 changes: 14 additions & 2 deletions gistfile1.clj
    Original file line number Diff line number Diff line change
    @@ -42,6 +42,7 @@


    ;includes?
    ;シーケンス内に要素あるか調べる
    (includes? [1 2 3 4 5] 4)
    ;true
    (includes? [1 2 3 4 5] 10)
    @@ -90,19 +91,30 @@
    (positions #(= \c %) "clojure is cool")
    ;(0 11)

    ;rand-elt
    ;rand-nth(rand-elt)
    ;DEPRECATED. Prefer clojure.core/rand-nth.
    ; ランダム選択
    (rand-elt [1 2 3 4 5])
    (rand-nth [1 2 3 4 5])
    ;4
    (rand-nth [1 2 3 4 5])
    ;2
    (rand-nth "Clojure")
    ;\e
    (rand-nth "Clojure")
    ;\o
    (rand-nth "Clojure")
    ;\o
    (rand-nth "Clojure")
    ;\u
    (rand-nth "Clojure")
    ;\o


    ;rec-seq
    ; 自己参照するシーケンスを作る
    (take 10 (rec-seq rec (lazy-cat (range 3) rec)))
    (take 10 (rec-seq self (lazy-cat (range 3) self)))
    ;(0 1 2 0 1 2 0 1 2 0)


    ;rec-cat
  3. deltam created this gist Jan 14, 2011.
    157 changes: 157 additions & 0 deletions gistfile1.clj
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,157 @@
    (ns intro-seq.core
    (:use [clojure.contrib seq]))

    ; Clojure初心者向けに覚えておくと便利なシーケンス操作関数を解説する

    ; 全部で16個



    ;find-first
    ;シーケンスの中から条件に合う最初の要素を返す
    ;
    (find-first #(> % 3) [1 2 3 4 5])
    ;=> 4
    (find-first #(Character/isLowerCase %) "Clojure")
    ;\l


    ;flatten
    ;階層構造のあるシーケンスを均す
    (flatten '((1 2 3) (4 5 6)))
    ;=> (1 2 3 4 5 6)


    ;frequencies
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素の出現回数を数える
    ;要素をkey,出現回数をvalueにしたマップを返す
    (frequencies [1 1 2 3 5 8])
    ;{8 1, 5 1, 3 1, 2 1, 1 2}
    (frequencies "clojure is cool")
    ;{\space 2, \c 2, \e 1, \i 1, \j 1, \l 2, \o 3, \r 1, \s 1, \u 1}

    ;group-by
    ;DEPRECATED. Prefer clojure.core version.
    ;シーケンスの要素に指定された関数を適用し、その結果が同じものをグループ化する
    ;関数の値をkey、vectorでグループ化したものをvalueにしたMapを返す
    (group-by #(* 2 %) [1 2 3 4 5])
    ;{2 [1], 4 [2], 6 [3], 8 [4], 10 [5]}
    (group-by odd? (range 10))
    ;{false [0 2 4 6 8], true [1 3 5 7 9]}


    ;includes?
    (includes? [1 2 3 4 5] 4)
    ;true
    (includes? [1 2 3 4 5] 10)
    ;false
    (includes? "clojure" \c)
    ;true
    (includes? "clojure" \x)
    ;false


    ;indexed
    ; シーケンスの各要素をインデックス付きのベクタに変える
    ; clojure.core/map-indexedも便利
    ; C言語などのfor文のような感じで使える
    (indexed '(:a :b :c))
    ;([0 :a] [1 :b] [2 :c])
    (indexed "clojure")
    ;([0 \c] [1 \l] [2 \o] [3 \j] [4 \u] [5 \r] [6 \e])


    ;partition-all
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンス要素を指定した個数ごとにまとめる
    (partition-all 2 '(1 2 3 4 5 6 7 8))
    ;((1 2) (3 4) (5 6) (7 8))
    (partition-all 3 '(1 2 3 4 5 6 7 8))
    ;((1 2 3) (4 5 6) (7 8))
    (partition-all 1 2 '(1 2 3 4 5 6 7 8))
    ;((1) (3) (5) (7))


    ;partition-by
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンスを条件ごとに切り分ける
    ; シーケンス要素に関数を摘要し、同じ結果が返る連続する要素をグループ化
    (partition-by #(> 3 %) '(1 2 3 4 5))
    ;((1 2) (3 4 5))
    (partition-by odd? (range 10))
    ;((0) (1) (2) (3) (4) (5) (6) (7) (8) (9))


    ; positions
    ; 条件が真になる要素の位置のシーケンスを返す
    (positions #(> 4 %) '(1 2 3 4 5))
    ;(0 1 2)
    (positions #(= \c %) "clojure is cool")
    ;(0 11)

    ;rand-elt
    ;DEPRECATED. Prefer clojure.core/rand-nth.
    ; ランダム選択
    (rand-elt [1 2 3 4 5])
    (rand-nth [1 2 3 4 5])
    ;4
    (rand-nth [1 2 3 4 5])
    ;2


    ;rec-seq
    ; 自己参照するシーケンスを作る
    (take 10 (rec-seq rec (lazy-cat (range 3) rec)))


    ;rec-cat
    ; 自己参照するシーケンスをconcatする
    ; 名前、初期値、
    (take 10 (rec-cat fibs [1 1] (map + fibs (rest fibs))))
    ;(1 1 2 3 5 8 13 21 34)
    ;http://clj-me.blogspot.com/2009/01/recursive-seqs.html


    ;reductions
    ;DEPRECATED. Prefer clojure.core version.
    ; シーケンスの先頭から各要素までreduceした結果を返す
    (reductions (fn [r x] (+ r x)) [1 2 3 4 5])
    ;(1 3 6 10 15)
    (reductions (fn [r x] (* r x)) [1 2 3 4 5])
    ;(1 2 6 24 120)

    ;rotations
    ;シーケンスの最初の要素を最後に持って行き、循環させたものを順番にシーケンス化
    (rotations [1 2 3 4])
    ;((1 2 3 4) (2 3 4 1) (3 4 1 2) (4 1 2 3))

    ;separate
    ; シーケンスをfilterして取得したものと、それ以外を両方取得
    ;奇数と偶数に分けてみる
    (separate odd? (range 10))
    ;[(1 3 5 7 9) (0 2 4 6 8)]


    ;seq-on
    ;任意の型を(seq ~)でシーケンスに変換できるように定義できるマルチメソッド


    ;shuffle
    ;ランダムシャッフル
    ;DEPRECATED. Prefer clojure.core version.
    (shuffle [1 2 3 4 5])
    ;(3 1 5 4 2)
    (shuffle [1 2 3 4 5])
    ;(3 4 5 2 1)
    (shuffle [1 2 3 4 5])
    ;(1 4 3 5 2)
    (shuffle [1 2 3 4 5])
    ;(4 3 2 1 5)


    ;fill-queue
    ; スレッド間で通信できる?(よく分からない)
    ; ↓でfill-queueの使用例が見れる
    ;The Infolace Story: Simple webhooks with Clojure and Ring
    ;http://infolace.blogspot.com/2009/08/simple-webhooks-with-clojure-and-ring.html