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)

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

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

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

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

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


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

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

Isaac Huang 發佈於