SlideShare a Scribd company logo
独自コレクションを定義しよう
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?

More Related Content

More from 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 35
Keisuke Fukuda
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke 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
 

More from 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)
 

Recently uploaded

論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 

Recently uploaded (8)

論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 

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