caasih.net

程式語言學習心得 1&2

data Expr a
  = EVar Name
  | ENum Int
  | EConstr Int Int
  | EAp (Expr a) (Expr a)
  | ELet
      IsRec
      [(a, Expr a)]
      (Expr a)
  | ECase
      (Expr a)
      [Alter a]
  | ELam [a] (Expr a)

今天幾乎完成了 pprint , pprint 把 CoreProgram 還有 CoreExpr 轉成中間格式 Iseq ,最後再轉成 String 。

data Iseq
  = INil
  | IStr String
  | IAppend Iseq Iseq
  | INewline
  | IIndent Iseq

CoreExpr 有 EVar, ENum, EConstr, EAp, ELet, ECase, ELam 七種 data constructor ,但排版用的 Iseq 只有 INil, IStr, IAppend 三種,就算加上未來的 IIndent 和 INewline 也不過五種。最後輸出的 String 就只有一種了。

可見 pprint 是個損失資訊的過程,資訊變少的新結構 Iseq 是專門為 pretty print 設計的,但原來的 CoreExpr 是為了直譯或是編譯而設計的。

在寫 pprint 時的錯誤少了,表示過去一年沒白寫吧?但繞了好多彎路。


加上了 INewline 和 IIndent , flatten 時要多一個參數追蹤現在印到哪個 column ,但只在 IIndent 出現時,才真的把位移與當下的 Iseq 綁在一起。

接下來要為 infix operators 加上 precedence level ,並看情況補括號,棄用自動加括號的 pprAExpr 函數。

由 Isaac Huang 發佈於