SlideShare a Scribd company logo
1 of 76
Download to read offline
Evolution
Of
Enumerator
Akinori Musha (@knu)
Machimachi Inc.
2019-03-23 Rails Developer Meetup 2019
自己紹介
武者 晶紀 (@knu)
• GitHub: https://github.com/knu
• Twitter: https://twitter.com/knu
• Docker Hub
!
武者 晶紀 (@knu)
• 武者 (Musha)
• Kanji: martial/brave-one
• Meaning: samurai
• 晶紀 (Akinori)
• Kanji: shine/bright-age/century
• Meaning: (My parents' hope) Shine in the next (21st) century
• knu
• Meaning: ?
武者 晶紀 (@knu)
• FreeBSD committer (Ports): knu@FreeBSD.org
• Ruby committer: knu@ruby-lang.org
• (Sorted)Setの作者
• Enumeratorの作者
• Rails: 4.1∼ (2014)
• Team Nokogiri, Team Huginn, …
• A Father Of Two
!"
• Working at Machimachi Inc.
趣味
• 将棋
!"
アマ五段 (指す、観る)
• Minecraft
⛏$
• ランチ
%
(渋谷、中目黒、学芸大学、自由が丘あたり)
• クラフトビールを飲む: Craft beer
• 音楽を聴く
'
(Progressive, metal music)
マチマチは「ひらかれた、つながりのあ
る地域社会をつくる」というミッション
を掲げ、地域の課題を解決するための社
会インフラを作る一環として、ご近所
SNSと地域情報ポータルサイトを運営し
ています。
https://machimachi.com/
ご近所さんと、まちの子育てやオススメ
のお店・病院などについて情報交換がで
きるサービスです。1
1 
ずっと実名制でしたが、最近ニックネームで気軽に参加できるようになりまし
た。
マチマチを支える技術
• Ruby / Rails
• React.js
• PostgreSQL / PostGIS
• GCP / GAE Flex Environment
技術ブログを書いています!
https://tech.machimachi.com/
We are hiring!
Enumerableモジュールの良さ
• メソッドに着目した機能拡張(mix-in)
• 値を列挙するeachメソッドをprimitiveとして用い、map,
select, to_aなどを定義する
• eachさえ定義してinclude Enumerableすれば、盛りだく
さんの機能が付加される
• どんなコレクションも同じ使い勝手で使える
内部イテレータと
外部イテレータ
外部イテレータ (External Iterator)
• 多くの言語・ライブラリはこちらが基本
• 繰り返しを制御する役割がコレクションオブジェクトまたはメソッドの外部、
つまり使う側にある
• 使う側が自由なタイミングでカーソルを進められるので、処理の自由度は高い
• コレクションを使う側がループ変数を管理する必要がある点は面倒
• for文などの糖衣構文で支援するのが通例
• eachにあたる処理はfor文、mapにあたる処理はリスト内包表記、のように同じ
繰り返しでも構文の使い分けが必要になる (each: for, map: list comprehension)
内部イテレータ (Internal Iterator)
• Rubyはこちらが基本
• 繰り返しを制御する役割がコレクションオブジェクトまたはメソッドの内部、
つまりオブジェクト側にある
• 実体としては、繰り返しごとに実行する関数を受け取る高階関数
• 要素ごとのコールバック関数を書くだけなので、定型のループ処理の記述はと
ても簡単
• 複数のコレクションを同期的に舐めるなどは苦手(あるいは無理)
• eachもmapも同じ構文で書ける (each & map share a common construct)
Rubyの内部イテレータ
Internal Iterator In Ruby
• each + Enumerable をAPIとして全面採用している
• 高階関数としての内部イテレータを使いやすいよう、ブロックという特
殊構文を用意
• break, next などループに適したジャンプ命令を提供
• さらに return で外側のメソッドからも抜けられる
• 結果として、外部イテレータと 色ない処理の表現力
Rubyの外部イテレータ
External Iterator In Ruby
• Ruby 1.8以前は標準的なサポートはなかった
• IOなどは、gets, eof?などの(伝統的な)外部イテレータ型
のAPIも提供している
• 配列など添え字アクセスができるコレクションの場合は、自
力でインデックス変数を操作してwhile文で回すなど
関連: Ruby 1.8のGenerator
Ruby 1.8.1∼1.8.7には、私が書いた generator という実験的
な外部イテレータ生成ライブラリが標準添付されていました。
(2003-2008)
関連: Ruby 1.8のGenerator
• Generator: converts an internal iterator to an external iteretor
• 具体的には、Enumerableオブジェクトを渡すと、nextメソッドを呼ぶ度にそこから
要素が順に返るオブジェクトを作る
• callcc (!)を使い、内部イテレータの繰り返しを止めたり再開して制御を奪う豪快な
実装
!
• 後にThreadによるリライトも試みられた
• いずれにせよ、毎回繰り返しを止めては再開 するのでオーバーヘッドがすごい
• SyncEnumerator: Generatorを使って複数の内部イテレータを同期的に繰り返す (lazyな
zip)
Generatorの使用例
2つ(以上)のコレクションを同期的にループ処理できる。
require "generator"
array1 = ["A", "B", "C", "D"]
array2 = ["A", "B", "D", "C"]
g1 = Generator.new(array1)
g2 = Generator.new(array2)
loop do
e1 = g1.next
e2 = g2.next
# compare elements, etc.
end
eachでも2つの配列の各要素を比較したい
複数のeachは同期できない
!
array1 = ["A", "B", "C", "D"]
array2 = ["A", "B", "D", "C"]
array1.each do |e1|
array2.each do |e2|
# gets all combinations
end
end
eachでも2つの配列の各要素を比較したい
片方だけ内部イテレータを使い、もう一方は添え字アクセスすれば可能
array1 = ["A", "B", "C", "D"]
array2 = ["A", "B", "D", "C"]
array1.each_with_index do |e1, i|
e2 = array2[i]
# This is OK
end
ただ、添え字アクセスできないイテレータ同士の場合はいったん配列化するなどの前処理が必要。
また、状況によって片方だけポインタを進める、のような処理はオフセットの管理も必要にな
る。
列挙いろいろ
列挙したいものいろいろ
Things To Enumerate
ハッシュ(Hash)の場合:
• キーと値の組(pair)
• キー(key)
• 値(value)
列挙単位いろいろ
Units For Iteration
文字列(String)の場合:
• 論理行(line)
• バイト(byte)
• 「文字」(char)
• コードポイント(codepoint)
• 書記素クラスタ(grapheme cluster)
• その他、語(word)、文(sentence)、段落(paragraph)、物理行(physical line)なども考えられ
る。
Enumeratorの誕生まで
Enumerableが提供してきた役割
• 内部イテレータのフレームワーク (framework for internal
iterators)
• クラスにincludeする(mix-in)
• そのクラスのeachを拡張する
Mix-inとしての限界
• includeではeachしか拡張できない!
(Enumerable can only extend each)
• each_byteやeach_keyでもmapやselectしたい
• 配列(Array)化してやればできるけど、たとえばfindのように1つ見つかっ
たら残りは要らない、というときは非効率 (Intermediate arrays require
memory)
• ObjectSpace.each_objectのようにモジュールメソッドがイテレータ、
という例もある (ObjectSpace is not an enumerable object, yet provides an
iterator method)
EachDelegatorという発想
岡田 潤さん作のEachDelegator (2001)
指定したイテレータメソッドを書き換え、ブロックなしで呼び出されたらEnumerableなオブ
ジェクトを返す、「ブロックなしeach」の先行提案
require "eachdelegator"
class String
each_delegator :each_byte
end
"あ".each_byte.each_with_index.collect { |byte, i|
[i, "%02X" % byte]
}
#=> [[0, "E3"], [1, "81"], [2, "82"]]
Enumeratorの発案
• このアイデアに感銘を受けた私は、Enumeratorを提案 (May 2001)
• [ruby-list:29604] Importing eachdelegator.rb
• [ruby-list:29624] Enumerator
• [ruby-dev:13202] Re: [ruby-list:29672] Re: Enumerator
• [ruby-dev:13259] Enumerator -- Round 2
• Enumerable::Enumeratorクラスを設け、
Kernel#enum_with(:each_xxx) でそのインスタンスを返すという内容
• each_xxx メソッドを支援したい
Enumeratorの採用
Ruby 1.8.1に標準ライブラリとして採用 (Oct
2003)
• この時点では、まだrequire "enumerator"が必要な一ライブラリ
• 組み込みではないので、標準クラスのeachでEnumeratorが返るとい
う機能もなし
• enum_with / each_for でメソッドを指定して使う
• ここで、繰り返し処理一般を拡張する機能を2つ導入した
繰り返しの拡張
• 指定個数ずつのスライス (each_slice)
• 連続要素の繰り返し (each_cons)
指定個数ずつのスライス
each_slice(n)でn要素ずつまとめて繰り返す
# 100通ずつタスク化
recipient_ids.each_slice(100) do |ids|
MessageJob.perform_later(ids: ids)
end
連続要素の繰り返し
each_cons(n)で「各要素+後続の計n要素」について1つずつ
ずらしながら繰り返す
[1, 2, 3, 4, 5, 6].each_cons(3) do |es|
p es
end
# [1, 2, 3]
# [2, 3, 4]
# [3, 4, 5]
# [4, 5, 6]
連続要素の繰り返し
• nil埋めせずに (size - n + 1) 回繰り返して終わってしま
うので、「コンテキスト付き繰り返し」として使うには
ちょっと足りない
• たとえば最初に [nil, 1, 2]、最後に [5, 6, nil] を足
してくれれば全要素の前後コンテキスト付き繰り返しになる
のに…
!
Ruby 2.6のchainで救済されます!(後述)
Ruby 1.9の開発が進む
複数の大きな変更を含むRuby 1.9の開発はかなり難航した
• インタプリタの差し替え(YARV)
• 正規表現エンジンの変更(鬼車 Oniguruma)
• CSI方式のM17N導入
• 新文法 ({ key: value }, -> {}) etc.
インタプリタの差し替え(YARV)
• VMの導入
• OSのネイティブスレッドを使うように (pthread)
• Threadより軽量なコルーチン機構 (Fiber)
余談: 正規表現エンジンの変更
• 新たに書き起こされたエンジン「鬼車」(Oniguruma) by K.Kosako
• それまではGNU regexライブラリを(魔)改造して使っていた
• Perl拡張をがんばって実装してきたが、拡張性にも限界
• ライセンスがここだけLGPLだったので取り扱いに注意を要した
• Rubyでは未実装だったPerl互換の追加機能をほぼすべて備え、BSDL
で、拡張性、性能にも優れていた
• 現在(2012-)は後継の「鬼雲」(Onigmo)になっている
余談: CSI方式のM17N導入
• Code Set Independent方式
• 個々のStringオブジェクトが自身でエンコーディング情報を持ち、複
数のエンコーディングの文字列データが混在できる
• あまり他の言語に類を見ない
• 内部エンコーディングはUTF-8のみに統一するのが(当時でも)大勢
• せいぜい選べても1つのみ
• 鬼車の複数エンコーディング対応部が礎となっている
Enumeratorの
組み込み化と成長
Enumeratorの組み込み化
• ext/enumerator からトップレベルに移動し、デフォルトでロードされるよ
うに (2005)
• requireが不要に
!
• 組み込みクラスに「ブロックなしeach」が実装される
• Ruby 1.9のFiberを利用してnext, next?, rewindが実装される (Aug 2007)
ついにEnumeratorが外部イテレータ兼用に!
(Enumerator became usable as an external iterator)
• これでGeneratorは無事引退
"
Enumeratorの正式な組み込み化
• Ruby 1.9.0-devリリース
!
(Dec 2007)
• 1.8系にもバックポートされ私がして、Ruby 1.8.7リリース (Jun 2008)
やがて来る1.9.1とのギャップを減らしたかった
• 1.9.1での安定版リリースを控え、さらにここからEnumeratorの仕様詰めが進む…
• メモオブジェクトの付加機能
(Iteration with a memo object)
• インデックスの付加
(Iteration with an index number)
Iteration With A Memo Object
ループ内(だけ)で共有できるオブジェクトを持ち、そこに情
報を集約して結果値として得たい
result = {}
records.each do |record|
result[record.id] = record
end
p result
# 宣言/初期化、操作、参照の3ステップをまとめたい
Iteration With A Memo Object
inject/reduceを使うとできるが、ブロックの返り値を意識し
ないといけない
result = records.inject({}) { |hash, record|
hash[record.id] = record
hash # あまりこれを書きたくない
}
Iteration With A Memo Object
Enumerator#with_memoの名前で提案した (Jun 2008)
• [ruby-core:17084] Enumerable::Enumerator#with_memo
• 最低限の記述で実現できる
result = records.each.with_memo({}) { |record, hash|
hash[record.id] = record
}
• with_object, with_obj, withなどの案も添え、その後、introduceというかっこいい案
も出した
• しかしなかなか決めきれず、無難な each_with_object という名前で入れて寝かせること
にした
!
(To be continued)
Iteration With An Index Number
• each_with_indexはあるが、開始値が0固定なので、originを指定したい
[ruby-dev:37921] with_index_from
by mameさん (2009)
• 今までは自分でオフセットを足していた
file.each_with_index do |line, i|
print "#{i+1}: #{line}"
end
• each_with_indexに引数を足したかったが、each_with_indexに渡された引数はその
ままeachに渡るようになっている
• たとえばString#eachはオプショナル引数で改行に代わる区切り文字を指定できる
Iteration With An Index Number
• each_with_indexはそのままに、
Enumerator#with_indexだけ拡張することにして採用
(Feb 2009)
file.each.with_index(1) do |line, i|
print "#{i}: #{line}"
end
Ruby 1.9の一般向けリリース
そして気が付くと…
Ruby 1.9.1リリース
!
(Jan 2009)
• 若干不本意ながら、 each_with_object / with_object
がその名前で確定することに
!
• 長いなあと思う人も多いと思いますが、こういう事情でし
た
Enumeratorの
さらなる発展
Enumeratorのさらなる発展
• 遅延評価 (Lazy Iterators)
• 自由な列挙 (Freehand Iterators)
• イテレータの連鎖 (Chaining Iterators)
Lazy Iterators
• find, any?, all?など、条件に合う(合わない)要素が出現したら打ち切り、という
Enumerableのメソッドが色々ある
• mapやselectを連鎖させるとき、毎回配列を作るのは空間効率が悪い
• 集約したい場合、入れ物を用意するのは最後だけで十分なはず
• そもそも、フィルタリングだけが必要で、集約自体は不要なことも多い
• [Feature #4653] Enumerable#rude_map by shyouhei (May 2011)
• [Feature #4890] Enumerable#lazy by yhara (Jun 2011)
• Ruby 1.9.3には間に合わず (Oct 2011)
• Ruby 2.0でEnumerable#lazyおよびEnumerator::Lazyが採用 (Feb 2013)
Freehand Iterators
• イテレータを実装するには、eachメソッドを定義する、が基本
• その場でEnumerableなオブジェクトを作って返したい、というとき、
Object.newして.extend(Enumerable) して特異メソッドeachを生
やす、というのはあまりカジュアルにやりたくない
• Enumeratorを作ったとき、Enumerableの拡張需要のパンドラの箱を開
くことになると予見した
"#
• 何でもできるものも必要だろう…と Enumerator.new {} をおまけ
で入れた
Chaining Iterators
Enumerator#+ がほしい、という要望が来たときも…
• [Feature #709] Enumerator#+ (Nov 2008)
by candlerb
「これで一応できるよ」
Enumerator.new { |y|
collection1.each { |x| y << x }
collection2.each { |x| y << x }
}.each do |x|
# Enumerates collection1, and then collection2
end
Chaining Iterators
というわけで、以下の理由から一回見送らせてもらった
• 演算子メソッドをあまり安易に入れるとあとで他の演算子と
の整合性で苦労・後悔する
• ユースケースがどのくらいあるかまだ明らかでない
• 今はEnumerator.new {}で手書きしてね
Chaining Iterators, A Decate Later
• そして十年後、今度はchainという名前で提案が来た
[Feature #15144] Enumerator#chain (Sep 2018)
by zverok
• その頃には、私自身の経験からも連鎖のユースケースは具
体的に見えていた
!
Chaining Iterators, A Decate Later
• 想定できるユースケース
• 例: コマンドラインオプションでの指定、環境変数の値、設定ファイル内の設定
値、の順に検索パスを返す
• 例: 最新の更新データをAPIから引っ張って返し、続いてローカルストレージに
キャッシュされた部分を返し、さらにそれ以前のものが必要ならAPIから引いて返す
• first(3), take_while, find などで効果を発揮
• 単純に、配列を作ることなく複数のストリームを順次走査したいことは実際に多い
• 全項目走査する場合でも効率的
✨
Chaining Iterators, A Decate Later
• Matzを交えた議論でも、 Enumerator#+ を割り当てても問
題なかろう
!
となった
• chain は Enumerable にあってもいいよね、となり、あわ
せてRuby 2.6で採用
"
Example: chain + each_cons =
Contexual Iteretion
a = ["foo", "bar", "baz"]
[nil].chain(a).each_cons(2) do |prev, curr|
if prev.nil?
puts "#{curr} comes first."
else
puts "#{curr} comes after #{prev}."
end
end
# Output:
foo comes first.
bar comes after foo.
baz comes after bar.
Ruby 2.7以降の
展望と課題
Ruby 2.7以降の展望と課題
• Enumerator::Yielder#to_proc
• Enumerator.generate
• Multi-Value Or Array?
• Lazy: Back To Eager?
Enumerator::Yielder#
to_proc
Enumerator::Yielder#to_proc
• [Feature #15618] Enumerator::Yielder#to_proc (Feb 2019)
by knu
Enumerator#to_procを実装することで
enum = Enumerator.new { |y|
Dir.glob("*.rb") { |file|
File.open(file) { |f| f.each_line(&y) }
# File.open(file) { |f| f.each_line { |line| y << line } }
}
}
と書けるようにする提案
• Ruby 2.7で採用
!
Enumerator.generate
Enumerator.generate
• [Feature #14781] Enumerator.generate (May 2018)
by zverok
• 一つ前の値から次の要素を決定する繰り返し
• 数学でいう「漸化式」による繰り返し定義
• ノードの parent を順に るとか
• リトライの待ち時間を倍々にしていくとか
• 検討事項
• 終了条件の指定方法(特定の例外で終わるのか、nilで終わるのか、その場合nilを含むのか)
• 2つ以上前も参照したい?(例: フィボナッチ数列… あまり現実にはない?)
Multi-Value Or Array?
Multi-Value Or Array?
• Hash#each / map はペアを1引数で2要素配列をブロックに渡してくる
[1] pry(main)> {foo: 1, bar: 2, baz: 3}.each{|x| p x}
[:foo, 1]
[:bar, 2]
[:baz, 3]
=> {:foo=>1, :bar=>2, :baz=>3}
[2] pry(main)> {foo: 1, bar: 2, baz: 3}.map{|x| p x}
[:foo, 1]
[:bar, 2]
[:baz, 3]
=> [[:foo, 1], [:bar, 2], [:baz, 3]]
Multi-Value Or Array?
• Hash#select / reject はペアを2引数でブロックに渡してくる
[3] pry(main)> {foo: 1, bar: 2, baz: 3}.reject{|x| p x}
:foo
:bar
:baz
=> {}
[4] pry(main)> {foo: 1, bar: 2, baz: 3}.select{|x| p x}
:foo
:bar
:baz
=> {:foo=>1, :bar=>2, :baz=>3}
Multi-Value Or Array?
• この違いはどこから?
• Hash#each / map はペアを2要素配列1つをブロックに渡してくる
(yield [key, value])
• Hash#select / reject はペアを2引数でブロックに渡してくる
(yield key, value)
• Hash#select / reject は、Ruby 1.8まではArrayを返すメソッドだったが、1.9か
らHashを返すように変更された
• そのときに、意図してか知らずか2引数で渡すようになった
• 今さら直せないとして、multi-value arrayの相互変換は需要があるかも
Multi-Value Or Array?
• タプルの各要素に対して、それぞれメソッドを適用する例
require "csv"
line = "10,foo,3.14"
modifiers = [:to_i, :to_s, :to_f]
# "10".send(:to_i), "foo".send(:to_s), "3.14".send(:to_f) を期待…
p CSV.parse_line(line).zip(modifiers).map(&:send)
#=> no method name given (ArgumentError)
• 実際には ["10", :to_i].send, … が実行されてしまう
Multi-Value Or Array?
もしarray→multi-valueに変換する機能があれば…
module Enumerable
def each_splat
return to_enum(__method__) unless block_given?
each { |a| yield(*a) }
end
end
Multi-Value Or Array?
うまくいく
!
require "csv"
line = "10,foo,3.14"
modifiers = [:to_i, :to_s, :to_f]
p CSV.parse_line(line).zip(modifiers).each_splat.map(&:send)
#=> [10, "foo", 3.14]
ちなみに…
• CSVにはconvertersというすばらしい機能があります!
line = "10,foo,3.14"
modifiers = [:to_i, :to_s, :to_f]
p CSV.parse_line(line, converters: ->(value, field) {
value.send(modifiers[field.index])
})
#=> [10, "foo", 3.14]
• というわけで説得に使うには適さないユースケースでした
Lazy: Back To Eager?
Lazy: Back To Eager?
• 一度lazyにすると、普通の(eagerな)Enumeratorには戻せない
lazy = [1, 2, 3].lazy
# Expecting #each would create a normal Enumerator...
still_lazy = lazy.each
# Not: Enumerator::Lazy#each is overridden to return a Lazy
# Not usable as a normal Enumerator
p still_lazy.map { |x| x * 2 }
#=> #<Enumerator::Lazy: #<Enumerator::Lazy: [1, 2, 3]>:map>
• lazyを駆使して作ったEnumeratorを、mapすると配列が返るようなふつうのEnumerableオブジェクト
として返したい
Enumerator::Lazy#eager (案)
もしlazyでないEnumeratorに変換する機能があれば…
class Enumerator::Lazy
def eager
Enumerator.new { |y|
each { |x| y << x }
}
end
end
Lazy: Back To Eager?
うまくいく
!
lazy = [1, 2, 3].lazy
eager = lazy.eager
# Usable as a normal enumerable object
p eager.map { |x| x * 2 }
#=> [2, 4, 6]
まとめ
まとめ
• みんな大好きEnumerableはどんどん進化してきました。
• Enumeratorの導入により、純粋に繰り返し自体の研究が進みました。
• 今も進化しています!
• 今後も、現実のニーズを踏まえて「ほしい!」機能を拡充していきます!
• 最近はRubyのリリースサイクルが高速化しているので、あなたも要望を出せば
年末には具現化するかも!
• クリスマスプレゼント
!
• マチマチで一緒に働く仲間を募集しています!

More Related Content

What's hot

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜Kosaku Ono
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義するblackenedgold
 

What's hot (9)

lsh
lshlsh
lsh
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
 

Similar to Evolution Of Enumerator

10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010Nobuaki Oshiro
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01nagachika t
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践LINE Corporation
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905Nobuaki Oshiro
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~Takaaki Tanaka
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章YOSHIKAWA Ryota
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているpocketberserker
 
とあるプロジェクトのつらみなコード
とあるプロジェクトのつらみなコードとあるプロジェクトのつらみなコード
とあるプロジェクトのつらみなコードYuya Taki
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索Akio Ishida
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
実行時のデータ型の表現手法
実行時のデータ型の表現手法実行時のデータ型の表現手法
実行時のデータ型の表現手法Atusi Maeda
 
Tokyo.R #67 初心者セッション3
Tokyo.R #67 初心者セッション3Tokyo.R #67 初心者セッション3
Tokyo.R #67 初心者セッション3Nozomi Miyazaki
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateepocketberserker
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 

Similar to Evolution Of Enumerator (20)

10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
とあるプロジェクトのつらみなコード
とあるプロジェクトのつらみなコードとあるプロジェクトのつらみなコード
とあるプロジェクトのつらみなコード
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
実行時のデータ型の表現手法
実行時のデータ型の表現手法実行時のデータ型の表現手法
実行時のデータ型の表現手法
 
Tokyo.R #67 初心者セッション3
Tokyo.R #67 初心者セッション3Tokyo.R #67 初心者セッション3
Tokyo.R #67 初心者セッション3
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIteratee
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 

Recently uploaded

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 

Recently uploaded (9)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 

Evolution Of Enumerator