Re: Build Your Own Haskell Compiler #0.1
預習
按 C 的計畫,這天要利用 Language.Haskell.Exts 這套件讀出原始碼本身屬於哪個套件、 import 了哪些套件,再把它們通通讀出來,然後印出來。建議先讀過的套件有:
- haskell-src-exts
- Language.Haskell.Exts.Annotated.Syntax
- Language.Haskell.Exts.Annotated.Parser
- Language.Haskell.Exts.Pretty
- Haskell Standard Library
- Data.Map.Strict
- System.IO
- System.FilePath
- Control.Exception
haskell-src-exts 在做那個愚蠢的、不 pretty 的 print 看過好幾次了。那時看的是 Language.Haskell.Exts.Syntax ,後來大家用的是 Language.Haskell.Exts.Annotated.Syntax 。要注意的是,後者的結構跟前者完全不同。 petercommand 一下子就發現了這件事。
Language.Haskell.Exts.Annotated.Syntax 下的 ann
和 amap
是操作 annotations 的工具,以前 Alex 有提過。前者把 annotation 拔出來,後者只對 annotation 作用。註解中還提到: if all nodes in the AST tree are to be affected, use fmap.
,這次可以用得上。
Language.Haskell.Exts.Pretty 比較妙的是, pretty 完就變回 Haskell 了,跟有縮排的 AST 不同。但對我們來說,更需要後者。那時曾試著看 TH 的,發現 Text.PrettyPrint ,但沒看懂。現在不知道看不看得懂 XDXD
另外 Hackage 多用 Haddock 註解。但是 Base 的 lhs 多用 \begin{code}
跟 \end{code}
把 code 包起來(LaTex suggestions)。這樣還有什麼意思呢? github 上只有到 2001 年的 commit ,不知道最早是不是就這樣?
Control.Exception 的作者是嘴吐 category theory 的 ekmett !
準備
一開始要以 haskell-src-exts 讀檔案,於是先在 app/Main.hs
中加上 import Language.Haskell.Exts.Annotated
;
module Main where
import Language.Haskell.Exts.Annotated
import Lib
main :: IO ()
main = someFunc
並修改 my-project.cabal
,在 executable my-project-exe
那段的 build-depends:
加上 haskell-src-exts
:
executable my-project-exe
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, my-project
, haskell-src-exts
default-language: Haskell2010
接著執行 stack build
,會看到它開始下載並編譯套件,需要花一點時間。