SlideShare a Scribd company logo
1 of 41
Download to read offline
Rubyでつくる
型付きRuby
とちぎRuby会議07 (2017-08-26)
@mametter(遠藤侑介)
自己紹介:@mametter(遠藤侑介)
• Ruby コミッタ(2008年~)
• Ruby への主な貢献
– Ruby 本体のテストや
RubySpec を増強した
– カバレッジ測定機能を実装した
• Ruby 2.5で分岐カバレッジ実装予定!
くわしくは RubyKaigi 2017@広島(9/18~20)で
– リリース管理に関わった(特に Ruby 1.9.2 と 2.0)
– キーワード引数やデッドロック検出などを実装した
’06下 ’07上 ’07下 ’08上
60
70
80
90
100
coverage(%)
70%
85%
C0カバレッジ遷移
自己紹介:@mametter(遠藤侑介)
• いろいろ本を書いてます(翻訳を含む)
Quine
とか変なプログラム
の本
インタプリタ
をRubyで
自作してみる本
型システム
の教科書
(”TAPL”の翻訳)
代入禁止
プログラミングの本
(”PFDS”の翻訳)
※翻訳歓迎!
今日のテーマ
• Ruby でつくる Ruby
Quine
とか変なプログラム
の本
インタプリタ
をRubyで
自作してみる本
型システム
の教科書
(”TAPL”の翻訳)
代入禁止
プログラミングの本
(”PFDS”の翻訳)
型システム
の教科書
(”TAPL”の翻訳)
型付き Ruby
Ruby インタプリタって何?
(matz製の)
Rubyインタプリタ
みなさんに質問
Rubyインタプリタ
作ったことのある人?
もしここが「とちぎScheme会議」だったら
• たぶんこうなる
みんな Ruby インタプリタ書こう!
• プログラマの教養として、自分の好きな言語の
インタプリタくらい作っておきたい!
– 実用レベルじゃなくてよい
– SchemeやMLの入門では定番の教材
• ガイドブックを書いた
– 144 ページ、128 行で
インタプリタが書ける!
– 対象読者:プログラミング未経験者
から Ruby 経験者まで
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要  今からここ
– インタプリタの構成と実装例
– ゴールと意義
• Ruby でつくる型付き Ruby
– Ruby と型の概観
– 漸進的型付けのアイデアと実装例
• まとめ
プログラミング言語とは
• コンピュータに対する指示を書くための言葉
コンピュータは
Ruby プログラムを
直接理解できない
✕
インタプリタとは
• プログラムの指示をコンピュータに伝えるプログ
ラム
– interpreter: 通訳
インタプリタは
コンピュータが
理解できるように
書いておく
インタプリタは
プログラムを読んで
解釈し、実行する
本書の内容
• Ruby 言語で Ruby インタプリタを書いてみる
– 「Ruby プログラムを読んで、解釈し、実行する」
– という Ruby プログラムを書く
• (eval は使わない)
• 疑問:作ったインタプリタはどうやって動かす?
– 答え:Matz 製のインタプリタに動かしてもらう
つまり、こういうこと
※こんなものを作って
何の意味があるかは後述
実際に作るもの
• MinRuby:Ruby のコア部分を切り出した言語
– 演算式(1 + 2 とか)
– 変数(x = 1 とか p(x) とか)
– 分岐とループ(if と while)
– 関数、配列とハッシュ
– オブジェクト指向やブロックは不必要(!)なので省く
• 本書の正確な内容:MinRuby で MinRuby インタ
プリタを作る
– インタプリタの実装も楽になる
– 覚えることが少ない(プログラミング未経験者でも読める!)
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要
– インタプリタの構成と実装例  今からここ
– ゴールと意義
• Ruby でつくる型付き Ruby
– Ruby と型の概観
– 漸進的型付けのアイデアと実装例
• まとめ
?
インタプリタの構成
入力
MinRuby
プログラムの
テキストファイル
出力
プログラムの
実行結果
1+2*3
7
構文解析
計算の木
(抽象構文木)
評価
プログラム文字列を
「木」に変換する
(ライブラリ使用)
「木」を見て
計算を行う
Ruby での木の表現方法
• ["演算子", 左の枝, 右の枝]
という配列を入れ子にして表現する
["+",
1,
["*",
2,
3
]
]
Ruby での木の表現方法
• ["演算子", 左の枝, 右の枝]
という配列を入れ子にして表現する
["+",
1,
["*",
2,
3
]
]
["+",
["lit", 1],
["*",
["lit", 2],
["lit", 3],
]
]
評価のイメージ
• 枝を切って
葉に差し替える
• これを繰り返す
• 葉だけに
なったら終了
評価器の実装
• 関数の再帰呼び出しを使う
– 本書における「関数」の定義=木を辿るための道具
再帰の初心者向け解説は、フィボナッチより木のトラバースの方がわかり
やすいのではないだろうか(木という目に見える再帰構造があるので)
def evaluate(tree)
if tree[0] == "lit"
tree[1]
elsif tree[0] == "+"
evaluate(tree[1]) + evaluate(tree[2])
elsif tree[0] == "*"
evaluate(tree[1]) * evaluate(tree[2])
end
end
“演算子”の部分
左の枝 右の枝
インタプリタ実装の進め方
1. 実装する言語機能の抽象構文木を観察する
2. 解釈の方法をプログラムに落としていく
• 例:if 文
– 抽象構文木:[“if”, 条件式, then部分, else部分]
– インタプリタ実装:
– if 文の実装に if を使う
インタプリタの本質は
ターゲット言語からホスト言語への丸投げ
if evaluate(tree[1])
evaluate(tree[2])
else
evaluate(tree[3])
end
つづきは本書で
• 言語機能をガンガン足していく
– 5章:複文、変数代入・参照
– 6章:if 文、while 文
– 7、8章:関数呼び出し、関数定義
– 9章:配列やハッシュの作成・参照・代入
MinRuby インタプリタの出来上がり
– 執筆時に工夫したこと
• 各章で一旦完結させる
– 動作しない状態で
終わらない
– 演習問題を入れる
• 退屈にならないようにする
– 実装対象の言語機能を考察する
– 環境などの必要な拡張をしたり
– each とか使ってない
(ブロックがないので使えない)
MinRuby インタプリタ全貌
require "minruby"
def evaluate(exp, genv, lenv)
case exp[0]
when "stmts"
last = nil
i = 1
while exp[i]
last = evaluate(exp[i], genv, lenv)
i = i + 1
end
last
when "lit"
exp[1]
when "+"
evaluate(exp[1], genv, lenv) + evaluate(exp[2], genv, lenv)
when "-"
evaluate(exp[1], genv, lenv) - evaluate(exp[2], genv, lenv)
when "*"
evaluate(exp[1], genv, lenv) * evaluate(exp[2], genv, lenv)
when "/"
evaluate(exp[1], genv, lenv) / evaluate(exp[2], genv, lenv)
when "%"
evaluate(exp[1], genv, lenv) % evaluate(exp[2], genv, lenv)
when "=="
evaluate(exp[1], genv, lenv) == evaluate(exp[2], genv, lenv)
when "<"
evaluate(exp[1], genv, lenv) < evaluate(exp[2], genv, lenv)
when "<="
evaluate(exp[1], genv, lenv) <= evaluate(exp[2], genv, lenv)
when ">"
evaluate(exp[1], genv, lenv) > evaluate(exp[2], genv, lenv)
when ">="
evaluate(exp[1], genv, lenv) >= evaluate(exp[2], genv, lenv)
when "var_ref"
lenv[exp[1]]
when "var_assign"
lenv[exp[1]] = evaluate(exp[2], genv, lenv)
when "if"
if evaluate(exp[1], genv, lenv)
evaluate(exp[2], genv, lenv)
else
evaluate(exp[3], genv, lenv) if exp[3]
end
when "while"
while evaluate(exp[1], genv, lenv)
evaluate(exp[2], genv, lenv)
end
when "func_def"
genv[exp[1]] = ["user_defined", exp[2], exp[3]]
when "func_call"
args = []
i = 0
while exp[i + 2]
args[i] = evaluate(exp[i + 2], genv, lenv)
i = i + 1
end
mhd = genv[exp[1]]
if mhd[0] == "builtin"
minruby_call(mhd[1], args)
else
new_lenv = {}
params = mhd[1]
i = 0
while params[i]
new_lenv[params[i]] = args[i]
i = i + 1
end
evaluate(mhd[2], genv, new_lenv)
end
when "ary_new"
ary = []
i = 0
while exp[i + 1]
ary[i] = evaluate(exp[i + 1], genv, lenv)
i = i + 1
end
ary
when "ary_assign"
ary = evaluate(exp[1], genv, lenv)
idx = evaluate(exp[2], genv, lenv)
val = evaluate(exp[3], genv, lenv)
ary[idx] = val
when "ary_ref"
ary = evaluate(exp[1], genv, lenv)
idx = evaluate(exp[2], genv, lenv)
ary[idx]
when "hash_new"
hsh = {}
i = 0
while exp[i + 1]
key = evaluate(exp[i + 1], genv, lenv)
val = evaluate(exp[i + 2], genv, lenv)
hsh[key] = val
i = i + 2
end
hsh
else
p("error")
pp(exp)
raise "unknown node: #{ exp[0] }"
end
end
genv = {
"p" => ["builtin", "p"],
"require" => ["builtin", "require"],
"minruby_parse" => ["builtin", "minruby_parse"],
"minruby_load" => ["builtin", "minruby_load"],
"minruby_call" => ["builtin", "minruby_call"],
}
lenv = {}
evaluate(minruby_parse(minruby_load()), genv, lenv)
空行含めて
無理なく 128 行
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要
– インタプリタの構成と実装例
– ゴールと意義  今からここ
• Ruby でつくる型付き Ruby
– Ruby と型の概観
– 漸進的型付けのアイデアと実装例
• まとめ
できたもの
• MinRuby で書かれた MinRuby インタプリタ
 インタプリタ自身も MinRuby プログラム
インタプリタがインタプリタ自身を実行できる!
(ブートストラップ)
本書のゴール:ブートストラップ
• 自分で書いたインタプリタで
• 自分で書いた
インタプリタ を
動かす
※インタプリタで
ブートストラップとは
言わないかも
RubyでRubyインタプリタを書く意義
• 実用上は無意味
– 機械語で書かれていないインタプリタは役に立たない
– 世の中、意味のないことのほうが面白い
• インタプリタの原理と構成を理解できる
– 教科書的な知識だけでなく実際に手を動かすのは重要
– ブートストラップに成功したときの達成感は半端ない
• Ruby 言語自体を深く考察する土台になる
– たとえば型とか
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要
– インタプリタの構成と実装例
– ゴールと意義
• Ruby でつくる型付き Ruby
– Ruby と型の概観  今からここ
– 漸進的型付けのアイデアと実装例
• まとめ
型とは
• 変数の取りうる値の範囲を表現したもの
– この呼び出しは OK
– この呼び出しは NG
• 参考情報:Matz は Ruby 3 で型を入れたいと言っている
– RubyKaigi 2017 @ 広島 でも関連発表が複数ありそう
def add_int(x: Integer, y: Integer)
x + y
end 型注釈
add_int(1, 2)
add_int("foo", 2)
型の目的
• 関数引数の想定を簡潔にドキュメント化したい
– うざい
• テストなしで自動的に『バグ』を見つけたい
– テストで 1 時間待ちたくない
sleep 3600
add("foo", 2)
# 引数 x と y は Integer を受け付けます
def add(x, y)
x + y
end
型で見つけたい『バグ』とは?
• この関数に対しては
– これにバグはない
– ほぼ明らかにバグ
– 動くけど目的外利用
def add_int(x, y)
x + y
end
add_int(1, 2)
add_int("foo", 2)
add_int("foo", "bar")
型で見つけたい『バグ』とは?
• この関数に対しては
– これにバグはない
– ほぼ明らかにバグ
– OKかも?(ダックタイピング)
– バグかどうかはプログラム単体では一意に決まらない
– プログラマの意図に依存する
def add(x, y)
x + y
end
add(1, 2)
add("foo", 2)
add("foo", "bar")
ダックタイピングを許す型注釈の例
• 解決1:オーバーロード
– 許したい型が増えたらドンドンうざくなる
• 解決2:構造的型付け
– 型が長く難しくなりがち
• 解決3:漸進的型付け
def add(x:Integer, y:Integer); x+y; end
def add(x: String, y: String); x+y; end
def add(x:α, y:α) where α.respond_to?(:+)
x+y
end
型のその他の問題
• 型注釈を書くのが面倒
• 型注釈のない既存資産が大量に存在する
– これらもだいたい漸進的型付けで解決できる
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要
– インタプリタの構成と実装例
– ゴールと意義
• Ruby でつくる型付き Ruby
– Ruby と型の概観
– 漸進的型付けのアイデアと実装例  今からここ
• まとめ
漸進的型付け [Siek ‘06] のアイデア
• 型ありと型なしの同居を認める
– 型注釈があったら型チェックされる
– 型注釈がなかったら型チェックしない
• Ruby での使い方
– ダックタイピングしたいところには型注釈を書かない
– 型注釈のない既存資産もとりあえずそのまま使える
(気が向いたときに書き足してもよい)
def add(x, y)
x + y
end
def add_int(x:Integer, y:Integer)
x + y
end
漸進的型付けの実装イメージ
• 型注釈がない変数は any 型とする
• any 型が絡む演算の結果は any 型とする
– すごく単純なアイデアだけど
2006 年頃にようやく登場
• 部分型(継承関係)を使った
アプローチが研究の泥沼だった
– 漸進的型付けは
Python 3 の型ヒントや
TypeScript の基盤でもある
(つまり多分 Ruby でも使える?)
J. G. Siek, et al. Gradual Typing for Functional Languages より引用
実装してみた、デモ
def add(x, y)
x + y
end
def add_int(x:Integer, y:Integer)
x + y
end
p(add(1, 2)) #=> 3
p(add("foo", 2)) #=> 実行時例外
p(add("foo", "bar") #=> "foobar"
p(add_int(1, 2)) #=> 3
p(add_int("foo", 2)) #=> 実行前に型エラー
p(add_int("foo", "bar") #=> 実行前に型エラー
※型注釈を含む構文解析は自作しました
(本には未掲載、本で読みたい人はラムダノート社長の鹿野さんを煽ってください)
まとめ:型付き MinRuby
• MinRuby を実験用環境として使う
– クラスやブロックなど、難しいものがないので実験し
やすい
• 漸進的型付けの Ruby 実用化への課題
– クラスやブロックなど、難しいものにも対応しないと
いけない
• Python や TypeScript が行けたくらいだから多分できる?
– 型推論の併用を考える
• TypeScript は局所型推論みたいなことをやってる
(関数の引数の方は推論しない)
目次
• 『Ruby でつくる Ruby』ダイジェスト
– 概要
– インタプリタの構成と実装例
– ゴールと意義
• Ruby でつくる型付き Ruby
– Ruby と型の概観
– 漸進的型付けのアイデアと実装例
• まとめ  今からここ
まとめ
• 『Ruby でつくる Ruby』
– Ruby 言語で
Ruby インタプリタを作る本
• この会場で直販中!
• インタプリタの原理と構成を
学べる
• Ruby 言語を冷静に見つめ、
機能拡張とかを考えられる
– 型とか

More Related Content

What's hot

クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料mametter
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 

What's hot (20)

クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 

Similar to Ruby でつくる型付き Ruby

Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
Boost.Spirit.QiとLLVM APIで遊ぼう
Boost.Spirit.QiとLLVM APIで遊ぼうBoost.Spirit.QiとLLVM APIで遊ぼう
Boost.Spirit.QiとLLVM APIで遊ぼうnvsofts
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてtnoda
 
Ruby2.0 Getting Started
Ruby2.0 Getting StartedRuby2.0 Getting Started
Ruby2.0 Getting StartedYuki Teraoka
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope高広 内山
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまでMugen Fujii
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道Shigeru UCHIYAMA
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会shiftky
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションsn_monochr
 
JavaとRubyのすてきな関係
JavaとRubyのすてきな関係JavaとRubyのすてきな関係
JavaとRubyのすてきな関係garden_tree
 
Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1Jun Yokoyama
 
JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014Naoki Shimizu
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
WordNetで作ろう! 言語横断検索サービス
WordNetで作ろう! 言語横断検索サービスWordNetで作ろう! 言語横断検索サービス
WordNetで作ろう! 言語横断検索サービスShintaro Takemura
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門masatora atarashi
 

Similar to Ruby でつくる型付き Ruby (20)

Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Boost.Spirit.QiとLLVM APIで遊ぼう
Boost.Spirit.QiとLLVM APIで遊ぼうBoost.Spirit.QiとLLVM APIで遊ぼう
Boost.Spirit.QiとLLVM APIで遊ぼう
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
Ruby2.0 Getting Started
Ruby2.0 Getting StartedRuby2.0 Getting Started
Ruby2.0 Getting Started
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
JavaとRubyのすてきな関係
JavaとRubyのすてきな関係JavaとRubyのすてきな関係
JavaとRubyのすてきな関係
 
Rails基礎講座 part.1
Rails基礎講座 part.1Rails基礎講座 part.1
Rails基礎講座 part.1
 
JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014
 
Ruby講座一回目
Ruby講座一回目Ruby講座一回目
Ruby講座一回目
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
WordNetで作ろう! 言語横断検索サービス
WordNetで作ろう! 言語横断検索サービスWordNetで作ろう! 言語横断検索サービス
WordNetで作ろう! 言語横断検索サービス
 
Ruby講座一回目
Ruby講座一回目Ruby講座一回目
Ruby講座一回目
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 

More from mametter

error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticsmametter
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfmametter
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotationsmametter
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画mametter
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3mametter
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってますmametter
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介mametter
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3mametter
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Typesmametter
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画mametter
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understandingmametter
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能mametter
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Rubymametter
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpretermametter
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるmametter
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 resultsmametter
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesmametter
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Rubymametter
 
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料mametter
 

More from mametter (20)

error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Ruby
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 results
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

Ruby でつくる型付き Ruby