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

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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介: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
 
論文紹介: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
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介: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
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
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
 
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
 

Dernier (10)

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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介: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
 
論文紹介: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...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介: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
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
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
 
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」の紹介
 

Scheme Interpreter in Ruby