星期四, 2月 18, 2010

Literate Programming in Haskell

Literate Programming 簡單的來說就是讓你在寫文件和寫程式的同時,能用 programming language compiler(e.g ghc) & typeseeting compiler (e.g. LaTeX) 分別產生文件和程式,通常最常見的是寫書,不過一般的 imperative programming language 要進行這樣子的動作是很困難的(code dependence & side effect),在 Haskell 中,這樣子的問題顯的相對的簡單而且容易處理。

Literal Programming in Haskell 的 programming compiler 通常是選用 ghc,而 typesetting 則是使用 LaTeX (XeLaTeX 也可以,代表你可以寫中文),一個文件的過程大抵如下

  • 寫作一個 latex + Haskell 的 code ,但是 Haskell 的 code 必需寫在 \begin{code}\end{code}
  • 該檔案存成的副檔名是 .lhs (vim 認的出來),而我們在這個時候必需再使用另外一個套件 lhs2TeX 來處理,基本上我們可以使用 cabal 來安裝。
  • 使用 lhs2Tex 將該檔轉成 .tex 檔供 LaTeX 編譯

Document

LaTeX 的寫作就有如 LaTeX XDXD,就請參考其他的 LaTeX 文件嘍,而在 lhs2TeX 的這方面有兩份文件,分別是

Example

以下是從 Slide 中來的 example,sample code 如下

\documentclass{article}
%include lhs2TeX.fmt
%include lhs2TeX.sty
\begin{document}
This is the famous ``Hello world'' example,
written in Haskell:
\begin{code}
main :: IO ()
main = putStrLn "Hello, world!"
\end{code}
\end{document}
  • compile to tex file
    lhs2TeX --tt test.lhs -o test.tex
    pdflatex test.tex
    pdflatex test.tex
    and you will see test.tex
    當然 --tt 可以換成其他的選項,例如 --verb, --math, --poly,細節可以看簡報的說明。
  • compile .lhs to executable
    ghc -o hello.out hello.lhs
    基本上跟一般 compile 程式是相同的。

---
感覺上好像寫了一篇很簡單的說明 XD。draft

張貼留言