Build Your Own Haskell Compiler #3
嗨, 1/14 的 caasi , commits 看得怎麼樣了?下一次活動是 1/28 ,然後就要過年了。我是 2/28 的 caasi ,現在要跟你說一些未來的事情,像是你會去一趟上海,你會很煩,但是你知道你必須要了解中國。你會在上海交大讀著印出來的程式,自我感覺良好,卻還是沒能完全搞懂。
但最重要的是,我要捏他!這樣也許你在學習的路上可以開心一點 XD
--
main = rhs
會變成:
PatBind l
(PVar l (Ident l "main"))
rhs
Nothing
l 是那長長一大串,包含這段 AST 來自程式碼那邊的原始資訊。可以靠著 forgetL
一次清掉。 PVar 的 P 是 Pattern 的 P 。 Nothing 是 where 的 binds ,在此例中什麼都沒有,故為 Nothing 。
case Just (Just (Pair 3 5)) of
成了:
Case l
(App l
(Con l (UnQual l (Ident l "Just")))
(Paren l
(App l
(Con l (UnQual l (Ident l "Just")))
(Paren l
(App l
(App l
(Con l (UnQual l (Ident l "Pair")))
(Lit l (Int l 3 "3"))
)
(Lit l (Int l 5 "5"))
)
)
)
)
)
後面接著的是 [Alt l]
。
_ | False -> exp
成了:
Alt l
(PWildCard l)
(GuardedRhss l
[ GuardedRhs l
[ Qualifier l (Con l (UnQual l (Ident l "False")))
]
exp
]
)
Nothing
Rhs
分為 UnGuardedRhs
和 GuardedRhss
兩種,前者直接帶個 exp
;後者帶一串 GuardedRhs
,都是 | stmts = exp
或 | stmts -> exp
這種樣子。
| Nothing -> exp
成了:
Alt l
(PApp l (UnQual l (Ident l "Nothing")) [])
(UnGuardedRhs l exp)
Nothing
原程式中的 Nothing
是 data constructor 喔,所以才包在 PApp
裡面,後面的 []
表示沒有參數。
a | False -> exp0
| True -> exp1
則成了:
Alt l
(PVar l (Ident "a"))
(GuardedRhss l
[ GuardedRhs l
[ Qualifier l (Con l (UnQual l (Ident l "False")))
]
exp0
, GuardedRhs l
[ Qualifier l (Con l (UnQual l (Ident l "True")))
]
exp1
]
)
Nothing
可以清楚看見 GuardedRhss
中的兩個 GuardedRhs
。
現在你知道你可以放心看看 altToPartial
、 dataConToShape
、 buildReorder
與 orderedCaseToExp
這些 function 。 AST 只要靜下心來就能懂,接下來交給時間就是了。