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
Nothingl 是那長長一大串,包含這段 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
]
)
NothingRhs 分為 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 只要靜下心來就能懂,接下來交給時間就是了。