SlideShare ist ein Scribd-Unternehmen logo
1 von 13
独自コレクションを定義しよう
Clojure座談会 #1 on 2015/09/12
@keisukefukuda
なぜClojureか
• Clojureは完全に趣味
• なぜClojureか
• 趣味なので、「本質的に学ぶところがある」言語をやりたい
• Goとか流行ってるけど本質的に新しくはないし
• Scala試して死んだ → そもそも俺はC++で荒れた心を休めたいんだ
よ
• Clojure、Haskell、Erlang(Elixir)くらい?
• といいつつある程度の実用性(JVM, Heroku)
• Minecraftとかの拡張書けるんじゃね?(まだ試してない)
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個の関数がある方が良い
(だいたい)なんでもmap, vector, set
• クラスを作ってメソッド実装というのは(あまり)やらない
• だいたいmapでおk
• clojureの大量の関数がそのまま使える
だけど
• 独自のデータ型が欲しい場合もある
• 例:
• 基本的には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)]
……))
だけど
• 独自のデータ型が欲しい場合もある
• 例:
• 基本的にはmapで良いが、一部の要素を遅延評価したい
• PDFパーザーを書いているときの実体験
{:a 1
:b (delay (do-something-1))
:c (future (do-something-2))
:d 2}
(let [a (get-a m)]
……)
メソッド定義する?
そこで
• 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
• clojure.lang.IPersistentCollection
• clojure.lang.IFn
• clojure.lang.ILookup
• java.util.Map
• java.lang.Iterable
• clojure.lang.Seqable
• clojure.lang.Reversible
やってみる
(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 _))))
ライブラリ化しよう
• 作業中
ブログにも少し書きました
http://freak-da.hatenablog.com/
Question?

Weitere ähnliche Inhalte

Mehr von Keisuke Fukuda

Supercomputing'18 概要紹介
Supercomputing'18 概要紹介Supercomputing'18 概要紹介
Supercomputing'18 概要紹介Keisuke Fukuda
 
深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?Keisuke Fukuda
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)Keisuke Fukuda
 

Mehr von Keisuke Fukuda (6)

Supercomputing'18 概要紹介
Supercomputing'18 概要紹介Supercomputing'18 概要紹介
Supercomputing'18 概要紹介
 
深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)
 

Kürzlich hochgeladen

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Kürzlich hochgeladen (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

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