Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
独自コレクションを定義しよう
Clojure座談会 #1 on 2015/09/12
@keisukefukuda
なぜClojureか
• Clojureは完全に趣味
• なぜClojureか
• 趣味なので、「本質的に学ぶところがある」言語をやりたい
• Goとか流行ってるけど本質的に新しくはないし
• Scala試して死んだ → そもそも俺はC++で荒...
Clojureの思想(の1つ)
"It is better to have 100 functions operate on one data
structure than to have 10 functions operate on 10 ...
(だいたい)なんでもmap, vector, set
• クラスを作ってメソッド実装というのは(あまり)やらない
• だいたいmapでおk
• clojureの大量の関数がそのまま使える
だけど
• 独自のデータ型が欲しい場合もある
• 例:
• 基本的にはmapで良いが、一部の要素を遅延評価したい
• PDFパーザーを書いているときの実体験
{:a 1
:b (delay (do-something-1))
:c (futur...
だけど
• 独自のデータ型が欲しい場合もある
• 例:
• 基本的にはmapで良いが、一部の要素を遅延評価したい
• PDFパーザーを書いているときの実体験
{:a 1
:b (delay (do-something-1))
:c (futur...
そこで
• Clojureのmapなどは、実装レベルではJavaのクラス
• ClojureではJavaのクラスを定義できる
• 組み込みデータ型と同じように振る舞う独自型を定義すれば
いいんじゃね?
http://www.rkn.io/2014/02/20/clojure-cookbook-rbt/
やってみる
• clojure.lang.APersistentMapがimplementしているインター
フェース
• clojure.lang.Associative
• clojure.lang.IPersistentMap
• cloj...
やってみる
(deftype MyMap1 [ks f]
clojure.lang.Associative
clojure.lang.IPersistentMap
(entryAt [this k]
(if (some #{k} ks)
(re...
ライブラリ化しよう
• 作業中
ブログにも少し書きました
http://freak-da.hatenablog.com/
Question?
Upcoming SlideShare
Loading in …5
×

Clojure座談会 #1 LT 独自コレクションを定義しよう

297 views

Published on

Clojure座談会#1(2015/09/12)で話したLTです

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Clojure座談会 #1 LT 独自コレクションを定義しよう

  1. 1. 独自コレクションを定義しよう Clojure座談会 #1 on 2015/09/12 @keisukefukuda
  2. 2. なぜClojureか • Clojureは完全に趣味 • なぜClojureか • 趣味なので、「本質的に学ぶところがある」言語をやりたい • Goとか流行ってるけど本質的に新しくはないし • Scala試して死んだ → そもそも俺はC++で荒れた心を休めたいんだ よ • Clojure、Haskell、Erlang(Elixir)くらい? • といいつつある程度の実用性(JVM, Heroku) • Minecraftとかの拡張書けるんじゃね?(まだ試してない)
  3. 3. Clojureの思想(の1つ) "It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures." - Alan J. Perlis from http://clojure.org/rationale 10のデータ構造のそれぞれに10個ずつ関数を作るよりも、1個 のデータ構造に100個の関数がある方が良い
  4. 4. (だいたい)なんでもmap, vector, set • クラスを作ってメソッド実装というのは(あまり)やらない • だいたいmapでおk • clojureの大量の関数がそのまま使える
  5. 5. だけど • 独自のデータ型が欲しい場合もある • 例: • 基本的にはmapで良いが、一部の要素を遅延評価したい • PDFパーザーを書いているときの実体験 {:a 1 :b (delay (do-something-1)) :c (future (do-something-2)) :d 2} (let [a (:a m)] (let [a (if (instance? clojure.lang.IDeref a) @a a)] ……))
  6. 6. だけど • 独自のデータ型が欲しい場合もある • 例: • 基本的にはmapで良いが、一部の要素を遅延評価したい • PDFパーザーを書いているときの実体験 {:a 1 :b (delay (do-something-1)) :c (future (do-something-2)) :d 2} (let [a (get-a m)] ……) メソッド定義する?
  7. 7. そこで • Clojureのmapなどは、実装レベルではJavaのクラス • ClojureではJavaのクラスを定義できる • 組み込みデータ型と同じように振る舞う独自型を定義すれば いいんじゃね?
  8. 8. http://www.rkn.io/2014/02/20/clojure-cookbook-rbt/
  9. 9. やってみる • clojure.lang.APersistentMapがimplementしているインター フェース • clojure.lang.Associative • clojure.lang.IPersistentMap • clojure.lang.IPersistentCollection • clojure.lang.IFn • clojure.lang.ILookup • java.util.Map • java.lang.Iterable • clojure.lang.Seqable • clojure.lang.Reversible
  10. 10. やってみる (deftype MyMap1 [ks f] clojure.lang.Associative clojure.lang.IPersistentMap (entryAt [this k] (if (some #{k} ks) (reify clojure.lang.IMapEntry (key [this] k) (val [this] (f k))) nil)) (assoc [this key val] this) (assocEx [this key val] (throw (Exception. "error"))) (without [this key] this) clojure.lang.IFn (invoke [this k] (let [v (.valAt this k)] v)) clojure.lang.ILookup (valAt [this k] (if (some #{k} ks) (f k) nil)) (valAt [this k not-found] (if (some #{k} ks) (.valAt this k) not-found)) clojure.lang.IPersistentCollection (count [_] (.count ks)) (empty [_] (.empty ks)) (equiv [this o] (and (instance? o MyMap1) (= (keys o) ks) (= (vals o) (map f keys)))) (cons [_ v] _) java.lang.Iterable (iterator [this] (let [s (seq this)] (reify java.util.Iterator (hasNext [this] (.hasNext s)) (next [this] (.next s)) (remove [this] (.remove s))))) clojure.lang.Seqable (seq [_] (map #(reify java.util.Map$Entry (getKey [_] %) (getValue [_] (f %))) ks)) clojure.lang.Reversible (rseq [_] (reverse (seq _))))
  11. 11. ライブラリ化しよう • 作業中
  12. 12. ブログにも少し書きました http://freak-da.hatenablog.com/
  13. 13. Question?

×