Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
つくってあそぼ ラムダ計算インタプリタ / Implement an Interpreter ...
Search
KMC_JP
October 18, 2018
Technology
0
1.2k
つくってあそぼ ラムダ計算インタプリタ / Implement an Interpreter of Lambda Calculus
KMC例会講座 / 型無しラムダ計算のインタプリタを実装してみよう
KMC_JP
October 18, 2018
Tweet
Share
More Decks by KMC_JP
See All by KMC_JP
▽SKKで日本語入力▼ / SKK Input Method
kmc_jp
0
110
Google Photosにネットで拾ったイラストを溜め込む
kmc_jp
0
410
Other Decks in Technology
See All in Technology
20250910_障害注入から効率的復旧へ_カオスエンジニアリング_生成AIで考えるAWS障害対応.pdf
sh_fk2
3
240
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
110
品質視点から考える組織デザイン/Organizational Design from Quality
mii3king
0
200
Platform開発が先行する Platform Engineeringの違和感
kintotechdev
4
560
La gouvernance territoriale des données grâce à la plateforme Terreze
bluehats
0
160
Autonomous Database - Dedicated 技術詳細 / adb-d_technical_detail_jp
oracle4engineer
PRO
4
10k
Webアプリケーションにオブザーバビリティを実装するRust入門ガイド
nwiizo
7
800
生成AI時代のデータ基盤設計〜ペースレイヤリングで実現する高速開発と持続性〜 / Levtech Meetup_Session_2
sansan_randd
1
150
ChatGPTとPlantUML/Mermaidによるソフトウェア設計
gowhich501
1
130
JTCにおける内製×スクラム開発への挑戦〜内製化率95%達成の舞台裏/JTC's challenge of in-house development with Scrum
aeonpeople
0
210
DDD集約とサービスコンテキスト境界との関係性
pandayumi
3
280
下手な強制、ダメ!絶対! 「ガードレール」を「檻」にさせない"ガバナンス"の取り方とは?
tsukaman
2
440
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
Speed Design
sergeychernyshev
32
1.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Making Projects Easy
brettharned
117
6.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Writing Fast Ruby
sferik
628
62k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Transcript
ͭͬͯ͋ͦ͘΅ ϥϜμܭࢉΠϯλϓϦλ ,.$ྫձߨ࠲!VUHXLL
ࣗݾհ w !VUHXLL ͏͕ͨΘ͖͖ w ֶ෦ใֶՊճੜ w ϓϩάϥϛϯάݴޠʹؔ͢Δݚڀ w
&VSP5SVDL4JNVMBUPS
ࢀߟ <>6S[ZD[ZOFUBM-FDUVSFTPOUIF$VSSZ)PXBSE *TPNPSQIJTN 4UVEJFTJO-PHJDBOEUIF'PVOEBUJPOTPG .BUIFNBUJDT &MTFWJFS4DJFODF <>IUUQXXXLCFDFJUPIPLVBDKQdTVNJJDMBTT LFJTBOLJTPGUXBSFLPVHBLVMBNCEBQEG <>IUUQUUJDVDIJDBHPFEVdQMDMBTTFT$.4$
8JOUFSMFDUVSFTMFDQEG
͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯΖ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮͠Α͏
ಈػ w ЕܭࢉͷݟͨίϯύΫτͰ͔ͭදݱྗ͕ڧ͍ w ͔࣮͠͠Λͨ͜͠ͱ͕ͳ͍ w ΠϯλϓϦλΛ࣮ͯ͠ΈΑ͏ w จಡΉͷ͕ͩΔ͍ͱ͖ʹखΛಈ͔ͯͨ͠
͜ͷߨ࠲ͷత w ʮΈͳ͞Μ͕ීஈ͍ͬͯΔϓϩάϥϛϯάݴޠ ͷΠϯ λϓϦλ ͜ͷΑ͏ʹ࣮͞Ε͍ͯΔʯͱ͍͏࣮ײΛ࣋ͬ ͯΒ͏ w ЕܭࢉΛ࣮ͨ͠ͱ͖ͷͭ·͖ͣϙΠϯτΛڞ༗͢Δ
͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯΖ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮͠Α͏
ܕແ͠ Еܭࢉ w ܭࢉͷϞσϧԽͷͻͱͭ w ؔΛͭ͘Δ ந w ؔΛద༻͢Δ
w ͜Ε͚ͩͰͳΜͱνϡʔϦϯάશ
Е߲ w .YcЕY.c.. w Yม w ؔநӈ݁߹ЕYЕZ.ЕY ЕZ. w
ؔద༻ࠨ݁߹123 12 3 w దʹׅހΛՃ͑ͯΑ͍
͞·͟·ͳЕ߲ w ЕYY Z w ЕYЕZY w ЕYЕZЕ[Y[ Z[
ଋറมͱࣗ༝ม w ଋറม w ؔநʹΑͬͯଋറ͞Ε͍ͯΔม w ЕYЕZYZ[ͷଋറมY Z w ࣗ༝ม
w ଋറมͰͳ͍ͷ w ЕYЕZYZ[ͷࣗ༝ม[
มͷஔ w .<Y/> w ߲.ʹొ͢Δࣗ༝มYΛ w ࠩ͠ࢧ͑ͳ͍ൣғͰ ߲/ʹஔ͢Δ w ࠩ͠ࢧ͑ͳ͍ൣғͬͯͳʹʁ
มͷஔͷྫ w Y<YЕZZ>ЕZZ w Z<YЕ[[>Z Y㱠Z w Y[ ZY
<YЕXX> ЕXX [ Z ЕXX w ЕYY<YЕZZ>ЕYY w ЕZY<YЕ[[>ЕZЕ[[ Y㱠Z
Ћม w ЕY.ЋЕZ.<YZ> w ࠩ͠ࢧ͑ͳ͍ൣғͰҾͷม໊ຊ࣭Ͱͳ͍ w ЕYYͱЕZZΛ۠ผ͢Δඞཁͳ͍Ͱ͢ΑͶʁ
Ќ؆ w ͬ͘͟Γݴ͑ؔద༻ w ЕY. /.<Y/>
Ќ؆Λମײ͢Δ w EFGG Y SFUVSOY Y w G
w ͜Ε͋͘·ͰମײͰ͢
Ќ؆ ЕYЕZЕ[Y[ Z[ ЕYЕZY ЕYЕZY ЕZЕ[
ЕYЕZY [ Z[ ЕYЕZY Е[ ЕYЕZY [ ЕYЕZY [ Е[ ЕZ[ ЕYЕZY [ Е[ ЕZ[ ЕZ[ Е[[
ਖ਼نܗ w ͜ΕҎ্Ќ؆Ͱ͖ͳ͍߲ w ྫ w Y w ЕYY w
ЕYЕZY
͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯΖ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮͠Α͏
༷ w ೖྗЕ߲ͷจࣈྻදݱ w ग़ྗЌ؆ͷεςοϓͱਖ਼نܗ ͷΑ͏ͳͷ w ͭ͡ඞͣ͠ਖ਼نܗʹ؆͞ΕΔΘ͚Ͱͳ͍
w Ќ؆ͯ͠Έͯɼ߲͕มԽ͠ͳ͔ͬͨΒఀࢭ͢Δ
࣮ݴޠ w ݴޠ0$BNMΛ͏ w ͦͦ͜͜πʔϧνΣʔϯ͕͋Δ w Θ͕ͨ͠Α͘৮͍ͬͯΔ w ͍͜ͳ͍ͤͯͳ͍ͱࢥ͏ʜʜ
؆·ͰͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
DGΠϯλϓϦλ τʔΫϯྻ *% Y &2/6. ߏจ 45.5 <"44*(/
Y > Ծػցίʔυ -0"% 4503& YY ࣈ۟ղੳ ߏจղੳ Ծػցίʔυͷม ධՁ ˞ͲΕ͘Β͍σʔλߏΛม͢Δ͔ઃܭʹΑΔ
Е߲ͷσʔλܕΛఆٛ͠Α͏ w .YcЕY.c.. w ࣮ʹམͱ͜͠Ή
Е߲ͷσʔλܕΛఆٛ͠Α͏ type id = string type term = |
Var of id | Fun of id * term | App of term * term
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
ߏจղੳ w ЕYYͷΑ͏ͳه߸ྻʹҙຯΛ࣋ͨͤΔ࡞ۀ w ЕYY'VO Y 7BSY w ݫີʹ͜ͷه߸ྻΛͦͷ··ѻ͏Θ͚Ͱͳ͍
ߏจղੳثΛ࣮͠Α͏ w NFOIJSΛ͏Α w ZBDDͷ0$BNM൛ͷ͍ͭ͢͝ w PDBNMZBDDͱ͍͏ͷ͋Δ w จ๏Λ#/'෩ͷͷͰهड़
τʔΫϯΛఆٛ͢Δ w .YcЕY.c.. w άοͱᛀΜͰඞཁͦ͏ͳτʔΫϯΛఆٛ͠Α͏ w *% ม w
-".#%" %05 Е w -1"3&/ 31"3&/ ׅހ w &0- Е߲ͷऴ
τʔΫϯΛఆٛ͢Δ %{ open Syntax %} %token <Syntax.id> ID %token
LAMBDA DOT %token LPAREN RPAREN %token EOL
จ๏Λఆٛ͢Δ w .YcЕY.c.. w άοͱᛀΜͰจ๏Λॻ͘ w NBJO&YQS&0- w &YQS-".#%"*%%05&YQSc"QQ&YQS w
"QQ&YQS"QQ&YQS"&YQSc"&YQS w "&YQS*%c-1"3&/&YQS31"3&/
จ๏Λఆٛ͢Δ %start main %type <Syntax.term> main %% main: Expr EOL
{ $1 } Expr: | LAMBDA i=ID DOT e=Expr { Fun (i, e) } | AppExpr { $1 } AppExpr: | e1=AppExpr e2=AExpr { App (e1, e2) } | AExpr { $1 } AExpr: | i=ID { Var i } | LPAREN e=Expr RPAREN { e }
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
ࣈ۟ղੳ w ͦͦЕYYͷΑ͏ͳจࣈྻͷ··ͩͱѻ͍ͮΒ͍ w ۭനจࣈΛແࢹ͢Δͱ͔ w ίϝϯτ͜͜ͰऔΓআ͔ΕΔ w -".#%"*% Y
%05*% Y ͙Β͍ʹ໌֬ͳྻͩͱΑ͍
ࣈ۟ղੳثΛ࣮͠Α͏ w PDBNMMFYΛ͏Α w MFYͷ0$BNM൛ w ϧʔϧΛਖ਼نදݱͰهड़
ࣈ۟ղੳϧʔϧΛఆٛ͢Δ { open Parser } rule main = parse
[' ' '\t']+ { main lexbuf } | ['\n'] { EOL } | ['a'-'z'] { ID (Lexing.lexeme lexbuf) } | '\\' { LAMBDA } | '.' { DOT } | '(' { LPAREN } | ')' { RPAREN } | eof { exit 0 }
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
%F#SVJKOJOEFYʹม͠Α͏ w ʜʜͬͯͳʹʁ
Ћม ࢥ͍ग़͢ w ʮଋറมͷ໊લຊ࣭Ͱͳ͍ʯ w ͍ͬΆ͏ߏจʹଋറมͷ໊લ͕͋Δ w దʹมͷ໊લͷ͜ͱΛߟ͑ͳ͍ͱ ؆݁Ռ͕ΊͪΌͪ͘ΌʹͳΔ w
ଋറมͷ໊લʹଋറ͞Εͨ͘ͳ͍ʂʂʂʂ
Ќ؆ ·͕͍ͪ ЕYЕZЕ[Y[ Z[ ЕYЕ[Y ЕYЕZY
ЕZЕ[ ЕYЕ[Y [ Z[ ЕYЕZY Е[ ЕYЕ[Y [ ЕYЕZY [ Е[ Е[[ ЕYЕZY [ Е[ Е[[ ЕZ[ Е[ЕZ[
%F#SVJKOJOEFYʹม͠Α͏ w ؔநʹΑΔଋറ͔Βͷωετͷਂ͞Ͱม͕Ұҙʹ ఆ·Δ w ͜͜ͰJOEFYͱ͢Δ w ЕYЕZYЕЕ w ЕYЕZЕ[Y[
Z[ ЕЕЕ w ͨͩࣗ͠༝ม์͓ͬͯ͘
%F#SVJKOJOEFYͷڧΈ w มͷ໊લΛߏจ͔ΒऔΓআ͘͜ͱ͕Ͱ͖Δ w ؆ͷաఔͰͷЋมΛߟ͑ͳͯ͘Α͍
%F#SVJKOJOEFYͷม w % ϵ / Y /ϵ Y ϵ
Y ͕ఆٛ͞Ε͍ͯΔ w % ϵ / Y Y ϵ Y ͕ఆٛ͞Εͳ͍ɼࣗ༝มͰ͋Δ w % ϵ / ЕY. Е % ϵ\Y/ ^ / . w % ϵ / 12 % ϵ / 1 % ϵ / 2 w %NBJO . % \^ .
%F#SVJKOJOEFYͷม w ྫ w %NBJO ЕYЕZY w % \^
ЕYЕZY w Е % \Y^ ЕZY w ЕЕ % \Y Z^ Y w ЕЕ ЕЕ
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
%F#SVJKOJOEFYͷЌ؆ w ػցతͳJOEFYͷૢ࡞ͱஔ͚ͩͰЌ؆͕࣮ߦ͞ΕΔ w ͳΜ͔͍ࣜ͢͝ w ࢿྉ<>Λࢀর
࣮ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ 'VO Y %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[
Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFYม Ќ؆
࣮ͨ͠ͷ w IUUQTHJUIVCDPNVUHXLLMBNCEBDIBNB
σϞ w aYaZa[Y[ Z[ aYaZY aYaZY w aYaZa[Y[ Z[
aYa[Y aYaZY ม໊Λม͚͑ͨͩ w aG aYG YY aYG YY ఀࢭ͠ͳ͍
ࠓޙͷ՝ w ܕΛ͚Δ w ࣮͕ͨ͠ߨ࠲Ͱলུ w ࣗ༝มͷѻ͍Λ͏·͘Γ͍ͨ
·ͱΊ w Еܭࢉʹ͍ͭͯͳΜͱͳ͔͖ͬͯͨ͘ w ЕܭࢉͷΠϯλϓϦλΛ࣮ͨ͠