我已經在2天前開始學習Lisp,並且正在閱讀Paul Graham的ANSI Common List,它以非常有趣的方式公開了語言結構。對於初學者來說,這不是太理論,也不是太淺(正如Sierra-Bate的Head First Java,我個人討厭)。在簡短的通用語言介紹之後,他開始討論回合列表並舉出一個簡單列表壓縮的例子。基本上,讓el是一個重複n次的元素。你用一個單獨的列表替換所有的列表。要做到這一點,他給了代碼實現,但我試圖做我自己的,這顯然是工作。如果可能的話,我希望有人分析我的代碼並告訴我它的實現的關鍵點,我相信這有很多,因爲它是我第一次接觸Lisp。謝謝大家!Lisp最佳實踐
(defun compress (x)
"compress a list replacing repeated sequential values for (<n> <value>)"
(let ((lst '()) (fst t) (lt nil) (n 0))
(dolist (el x)
(if fst
(progn
(setq fst nil)
(setq lt el)
(setq n 1))
(progn
(if (equal el lt)
(setq n (+ n 1))
(progn
(setq lst (cons (if (= n 1)
lt
(list n lt))
lst))
(setq lt el)
(setq n 1)
)))))
(setq lst (cons (if (and (not (= n 0)) (= n 1))
lt
(list n lt))
lst))
(reverse lst)))
您還可能有興趣在彼得·塞貝爾的[Practical Common Lisp](http://www.gigamonkeys.com/book/)。 – molbdnilo
'(compress nil)'產生'((0 nil))',這看起來很奇怪。 –
@molbdnilo我也使用這些文獻,也是一個很好的文獻。但沒有找到一個PDF版本,只是Tex文件,這有點令人困惑,我無法編譯它。如果你有一個想法該怎麼做,請讓我知道。 –