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.1k
つくってあそぼ ラムダ計算インタプリタ / 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
400
Other Decks in Technology
See All in Technology
20250129 Findy_テスト高活用化
dshirae
0
230
ObservabilityCON on the Road Tokyoの見どころ
hamadakoji
0
230
Autify Company Deck
autifyhq
2
41k
自動と手動の両輪で開発するデータクレンジング
estie
2
100
20250130_『SUUMO』の裏側!第2弾 ~機械学習エンジニアリング編
recruitengineers
PRO
0
360
アンチパターンのアーキテクチャと組織 / Anti-Pattern Software Architecture and Organization
oztick139
0
120
SCSAから学ぶセキュリティ管理
masakamayama
0
100
NOSTR, réseau social et espace de liberté décentralisé
rlifchitz
0
140
CNAPPから考えるAWSガバナンスの実践と最適化
yuobayashi
5
690
例外処理を理解して、設計段階からエラーを「見つけやすく」「起こりにくく」する
kajitack
12
4.1k
Grid表示のレイアウトで Flow layoutsを使う
cffyoha
1
160
DeepSeek on AWS
hariby
1
170
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Fireside Chat
paigeccino
34
3.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
113
50k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.2k
A better future with KSS
kneath
238
17k
It's Worth the Effort
3n
184
28k
How GitHub (no longer) Works
holman
313
140k
Typedesign – Prime Four
hannesfritz
40
2.5k
Writing Fast Ruby
sferik
628
61k
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 ЕܭࢉͷΠϯλϓϦλΛ࣮ͨ͠