星期四, 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

1 則留言:

scm 提到...

其實 literate programming 和語言是不是 pure 沒什麼大關係哩。但一個語言的模組系統設計可能讓 literate programming 工具比較省事(或費事)些。

Literate programming 最早是 Knuth 在推動。他認為寫程式可以順著人的思路,不用照 compiler 的。最早的 literate prog. 工具 WEB 是給 Pascal 用的,後來有給 C 用的 CWEB. Knuth 有把整本書用這種方式寫出來過。

照 Knuth 的定義,Haskell 的 lhs 檔還不算有 literate programming 的完整功能。但話說回來 Haskell 語言本身對宣告順序等等的限制比起 C, Pascal 鬆多了,對大部分人來講這樣也夠用了。

我猜 literate programming 推動困難的原因是:程式寫得好的人不多,文章寫得好的人也不多,又會寫程式、又會寫文章,還會用 cweb 的人,更是鳳毛麟角呀...