SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Scheme Interpreter
in
Ruby
2016/01/26
0x64 Tales
#04 Compiler / Interpreter
Livesense Inc.
HORINOUCHI Masato
ハッカーになろう
LISP は、それをモノにしたときのすばらしい悟り体験のために勉
強しましょう。この体験は、その後の人生でよりよいプログラマ
ーとなる手助けとなるはずです。たとえ、実際には LISP そのもの
をあまり使わなくても。
— Eric S. Raymond
ハッカーになろう (How To Become A Hacker) から引用
普通のやつらの上を行け
彼がLispについて言っていることはよくある意見だ。つまり、Lisp
を学べばよいプログラマーになれる、でもそれを実際に使うこと
はない、と。
何故だい? プログラミング言語なんてただの道具じゃないか。Lisp
で良いプログラムが 書けるなら、使うべきなんだ。
— Paul Graham
普通のやつらの上を行け Bea%ng the Averages から引用
Let's Talk Lisp
某イベントの二次会で「実はRubyって『MatzLisp』というLispの
方言だったんだよ!」と語られたようです。何とも傑作なネタで
すが、Lispの強さを痛感したわたしが「自分が満足するために」
作り出したRubyは、文法こそ違うものの、その本質としてLisp文
化を継承しているのかもしれません。
— まつもとゆきひろ
Let's Talk Lisp から引用
参考図書
つくって学ぶプログラミング言語 Rubyに
よるScheme処理系の実装 1
プログラミングをより深く理解するため
の近道は、プログラミング言語を実装し
てみること。SchemeのサブセットをRuby
で実装していくことで、プログラムはど
う実行されるのか、その基本がはっきり
分かります。
1
CC BY なので無償だよ。有償版もあるので良かったら買ってね。
デモ
Fibonacci number (Scheme)
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else
(+ (fib (- n 2)) (fib (- n 1))))))
Fibonacci number (Ruby)
def fib(n)
case n
when 0
0
when 1
1
else
fib(n-2) + fib(n-1)
end
end
What is Environments.
もし動的スコープだとしたら…
((lambda (x)
((lambda (fun)
((lambda (x)
(fun))
1))
(lambda () x)))
2)
# => 1
↑動的スコープの Emacs Lisp では上記のコードで 1 が返ります。
もし(略) (Ruby版)
(lambda { |x|
(lambda { |fun|
(lambda { |x|
fun.call
}).call(1)
}).call(lambda { x })
}).call(2)
ちなみに Ruby は静的スコープなので、あくまでコードのわかり
やすさの話。
Scheme とあまり変わらないのはヒミツ…。
もし(略) (y に変更)
((lambda (x)
((lambda (fun)
((lambda (y)
(fun))
1))
(lambda () x)))
2)
# => 2
↑内側の (x) を (y) に変数名変更しただけで 2 になる。
もし静的スコープだとしたら…
((lambda (x)
((lambda (fun)
((lambda (x)
(fun))
1))
(lambda () x)))
2)
# => 2
↑ y に変更と同様 2 になる。
環境モデル
• 外側の lambda x と内側の lambda x を区別する必要がある。
• 外側の lambda を評価しているときは {x: 2} とする。
• 内側の lambda を評価しているときは {x: 1} とする。
• 真ん中の lambda fun を評価した際に、λ式と評価時の環境をペ
アとしてクロージャーを返す。
closure
• クロージャーはλ式と環境のペア。
• λ式を評価するとクロージャーが評価値となる。
• クロジャーを関数適用するときは、クロージャー中の環境を用
いて評価する。
=> 環境(静的スコープ)がないと closure は作れない。
評価と関数適用
• 関数と引数の部分に分け、それぞれを評価する。
• 引数をその関数に適用する。
• 関数の仮引数に実引数を束縛し、関数のボディを評価する。
=> 評価(eval)と関数適用(apply)を再帰的に繰り返す。
実装
• Ruby の _eval 関数と apply 関数を実行していく
• Scheme のリストは Ruby の Array
• Scheme の環境は Ruby の Hash の Array
• Scheme は Lisp-1 なので、Hash の Array は1つだけで ok系。
_eval
def _eval(exp, env)
if not list?(exp)
if immediate_val?(exp)
exp
else
lookup_var(exp, env)
end
else
if special_form?(exp)
eval_special_form(exp, env)
else
fun = _eval(car(exp), env)
args = eval_list(cdr(exp), env)
apply(fun, args)
end
end
end
apply
def apply(fun, args)
if primitive_fun?(fun)
apply_primitive_fun(fun, args)
else
lambda_apply(fun, args)
end
end
lookup_var と extend_env
def lookup_var(var, env)
alist = env.find { |alist| alist.key?(var) }
if alist == nil
raise "couldn't find value to variables: '#{var}'"
end
alist[var]
end
def extend_env(parameters, args, env)
alist = parameters.zip(args)
h = Hash.new
alist.each { |k, v| h[k] = v }
[h] + env
# ↑ 上記で env.find してるので Array の先頭に追加するのが重要。
end
parse
def parse(exp)
program = exp.strip().
gsub(/[a-zA-Z+-*><=][0-9a-zA-Z+-=!*]*/, ':0').
gsub(/s+/, ', ').
gsub(/(/, '[').
gsub(/)/, ']')
eval(program)
end
↑最後に Ruby の eval してる。
Next Step
計算機プログラムの構造と解釈 (通称
SICP)
MITの入門コースで使う計算機科学の優
れた教科書 ハル・エイブルソン, ジェリ
ー・サスマン, ジュリー・サスマン共著(和
田英一訳)「計算機プログラムの構造と解
釈 第二版」(ピアソン・エデュケーション
2000年). 表紙の魔術師ゆえにそういわれ
る. LISP/Scheme世界の聖典のひとつ.
← 図に "Eval / Apply" の太極図 (Tao) が描
かれているのにご注目。
まとめ
• LISP は構文解析が必要ないから処理系作りやすい。
• 環境モデルによって静的スコープを実現している。
• Scheme は完全な静的スコープのクロージャを持つ最初の言語
として登場した。
• Scheme は偉大。
ご清聴ありがとうございました

Contenu connexe

En vedette

A modified ode solver for autonomous initial value problems
A modified ode solver for autonomous initial value problemsA modified ode solver for autonomous initial value problems
A modified ode solver for autonomous initial value problemsAlexander Decker
 
9th march 2016 What is Love (in the fruit of the Holy Spirit)
9th march 2016   What is Love (in the fruit of the Holy Spirit)9th march 2016   What is Love (in the fruit of the Holy Spirit)
9th march 2016 What is Love (in the fruit of the Holy Spirit)Thorn Group Pvt Ltd
 
Etat des lieux européen du vrac. Journée Réseau VRAC #3
Etat des lieux européen du vrac. Journée Réseau VRAC #3Etat des lieux européen du vrac. Journée Réseau VRAC #3
Etat des lieux européen du vrac. Journée Réseau VRAC #3Zero Waste France, Cniid
 
Consejos para el ahorro familiar
Consejos para el ahorro familiarConsejos para el ahorro familiar
Consejos para el ahorro familiarLaura Lima
 
Ewrt 30 class 11 writer's workshop
Ewrt 30 class 11 writer's workshopEwrt 30 class 11 writer's workshop
Ewrt 30 class 11 writer's workshopkimpalmore
 
Línea de tiempo sobre la historia y evolución del comercio electrónico.
Línea de tiempo sobre la historia y evolución del comercio electrónico.Línea de tiempo sobre la historia y evolución del comercio electrónico.
Línea de tiempo sobre la historia y evolución del comercio electrónico.Juan Anaya
 

En vedette (8)

A modified ode solver for autonomous initial value problems
A modified ode solver for autonomous initial value problemsA modified ode solver for autonomous initial value problems
A modified ode solver for autonomous initial value problems
 
9th march 2016 What is Love (in the fruit of the Holy Spirit)
9th march 2016   What is Love (in the fruit of the Holy Spirit)9th march 2016   What is Love (in the fruit of the Holy Spirit)
9th march 2016 What is Love (in the fruit of the Holy Spirit)
 
Class 11 n
Class 11 nClass 11 n
Class 11 n
 
Week 5 proteins
Week 5   proteinsWeek 5   proteins
Week 5 proteins
 
Etat des lieux européen du vrac. Journée Réseau VRAC #3
Etat des lieux européen du vrac. Journée Réseau VRAC #3Etat des lieux européen du vrac. Journée Réseau VRAC #3
Etat des lieux européen du vrac. Journée Réseau VRAC #3
 
Consejos para el ahorro familiar
Consejos para el ahorro familiarConsejos para el ahorro familiar
Consejos para el ahorro familiar
 
Ewrt 30 class 11 writer's workshop
Ewrt 30 class 11 writer's workshopEwrt 30 class 11 writer's workshop
Ewrt 30 class 11 writer's workshop
 
Línea de tiempo sobre la historia y evolución del comercio electrónico.
Línea de tiempo sobre la historia y evolución del comercio electrónico.Línea de tiempo sobre la historia y evolución del comercio electrónico.
Línea de tiempo sobre la historia y evolución del comercio electrónico.
 

Similaire à Scheme Interpreter in Ruby

Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_distShohei Hido
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017Motohiro Ueki
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室higaki
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1耕平 谷口
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2yo0824
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介しくみ製作所
 
Using Deep Learning for Recommendation
Using Deep Learning for RecommendationUsing Deep Learning for Recommendation
Using Deep Learning for RecommendationEduardo Gonzalez
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform信之 岩永
 
Rで学ぶ離散選択モデル
Rで学ぶ離散選択モデルRで学ぶ離散選択モデル
Rで学ぶ離散選択モデル宏喜 佐野
 
cl-waffe2 実装
cl-waffe2 実装cl-waffe2 実装
cl-waffe2 実装hiketteinya
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Yuichiro Takahashi
 
リブセンスのインフラで使ってるAnsibleのお話
リブセンスのインフラで使ってるAnsibleのお話リブセンスのインフラで使ってるAnsibleのお話
リブセンスのインフラで使ってるAnsibleのお話Shohei Koyama
 
AmplifyShaderEditorを使ったLWRP対応について
AmplifyShaderEditorを使ったLWRP対応についてAmplifyShaderEditorを使ったLWRP対応について
AmplifyShaderEditorを使ったLWRP対応についてKazuki Ito
 
Fast abstractive summarization with reinforce selected sentence rewriting
Fast abstractive summarization with reinforce selected sentence rewritingFast abstractive summarization with reinforce selected sentence rewriting
Fast abstractive summarization with reinforce selected sentence rewritingYasuhide Miura
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Hisakuni Fujimoto
 

Similaire à Scheme Interpreter in Ruby (20)

Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
 
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
 
Using Deep Learning for Recommendation
Using Deep Learning for RecommendationUsing Deep Learning for Recommendation
Using Deep Learning for Recommendation
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
Rで学ぶ離散選択モデル
Rで学ぶ離散選択モデルRで学ぶ離散選択モデル
Rで学ぶ離散選択モデル
 
cl-waffe2 実装
cl-waffe2 実装cl-waffe2 実装
cl-waffe2 実装
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門
 
Rubyのススメ
RubyのススメRubyのススメ
Rubyのススメ
 
リブセンスのインフラで使ってるAnsibleのお話
リブセンスのインフラで使ってるAnsibleのお話リブセンスのインフラで使ってるAnsibleのお話
リブセンスのインフラで使ってるAnsibleのお話
 
AmplifyShaderEditorを使ったLWRP対応について
AmplifyShaderEditorを使ったLWRP対応についてAmplifyShaderEditorを使ったLWRP対応について
AmplifyShaderEditorを使ったLWRP対応について
 
Fast abstractive summarization with reinforce selected sentence rewriting
Fast abstractive summarization with reinforce selected sentence rewritingFast abstractive summarization with reinforce selected sentence rewriting
Fast abstractive summarization with reinforce selected sentence rewriting
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 

Plus de Masato HORINOUCHI (8)

Church Numerals
Church NumeralsChurch Numerals
Church Numerals
 
CPS & CTO
CPS & CTOCPS & CTO
CPS & CTO
 
Inside mml2wav.rb
Inside mml2wav.rbInside mml2wav.rb
Inside mml2wav.rb
 
A440
A440A440
A440
 
Clock / Timer
Clock / TimerClock / Timer
Clock / Timer
 
Hash Tree
Hash TreeHash Tree
Hash Tree
 
POSIX Threads
POSIX ThreadsPOSIX Threads
POSIX Threads
 
Elixir紹介
Elixir紹介Elixir紹介
Elixir紹介
 

Dernier

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
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日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Dernier (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

Scheme Interpreter in Ruby