caasih.net

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 分為 UnGuardedRhsGuardedRhss 兩種,前者直接帶個 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

現在你知道你可以放心看看 altToPartialdataConToShapebuildReorderorderedCaseToExp 這些 function 。 AST 只要靜下心來就能懂,接下來交給時間就是了。

由 Isaac Huang 發佈於