Why is Lisp so great?

自從看完了駭客與畫家後,就開始看Common Lisp相關的書和文章。其中我最有興趣的是Paul Graham不斷提起的macro。一開始我還不了解macro到底強在哪裡,為什麼能讓Lisp如此特別,直到發現Why is Lisp so great? or Why so many parenthesis?這篇文章,才大大一驚,原來macro是這樣玩的!這篇文章舉了Haskell著名的quicksort implementation為例
qsort []     = []qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_xwhereelts_lt_x   = [y | y < - xs, y < x]elts_greq_x = [y | y<- xs, y >= x]
這份實做真的非常漂亮,短短幾行就說完了qsort。但如果用原始的Lisp語法寫起來還蠻複雜的,因為Lisp沒有提供list comprehension(Haskell的中括號)這種特殊的簡潔語法。但透過macro,就可以自己幫Lisp加上新的語法,而且完全不用動到compiler。
(defun qsort (ax)(and ax(let ((a (car ax))(x (cdr ax)))(append (qsort [y (y < - x) (< y a)])   ; A(list a)          ; B(qsort [y (y<- x) (>= y a)])))))   ; C
多麼神奇的特色啊,也難怪Lisp可以活這麼久而且永遠有許多死忠支持者..。閱讀全文

Debugging Backwards in Time

剛發現這篇文章Debugging Backwards in Time。簡單的說,這篇文章的作者實做出一個稱為ODB(Omniscient Debugger)的除錯器,它可以讓debug變得像操作錄影機一樣,把整個程式執行過程的變化全部錄下來,於是你就能輕易地在執行時的時間點跳來跳去。以往只能從頭慢慢開始下一步,頂多設些中斷點。有了ODB後,debug完全不同了...。要是不小心跑過頭,可以來個"上一步",甚至可以直接從 exception發生的地方倒帶,看看到底哪裡發生了不該發生的事。這種debugger是每個程式設計師的夢想,但現在竟然成真了!相關的link:
  1. Bil Lewis, "Debugging Backwards in Time", 2003.
  2. Presentation video
閱讀全文