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_x
                 where
                   elts_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可以活這麼久而且永遠有許多死忠支持者..。

One thought on “Why is Lisp so great?

留言給我吧!