两天前我开始学习 Lisp,正在阅读 Paul Graham 的 ANSI Common List,它以一种非常有趣的方式展示了语言结构。对于初学者来说,它不是太理论化,也不是太浅(就像 Sierra-Bate 的 Head First Java,我个人讨厌它)。在简短的通用语言介绍之后,他开始谈论列表并举了一个简单列表压缩的例子。基本上,设 el 是一个重复 n 次的元素。您将所有这些替换为一个 (n el) 列表。为此,他提供了一个代码实现,但我尝试自己做,这显然是有效的。如果可能的话,我希望有人分析我的代码并向我展示其实现的关键点,我确信有很多,因为这是我第一次接触 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)))