压缩与解压缩示例:游标编码(run-length encoding)
1 (defun compress (x) 2 (if (consp x) 3 (compr (car x) 1 (cdr x)) 4 x)) 5 6 (defun compr (elt n lst) 7 (if (null lst) 8 (list (n-elts elt n)) 9 (let ((next (car lst))) 10 (if (equal next elt) 11 (compr next (+ n 1) (cdr lst)) 12 (cons (n-elts elt n) 13 (compr next 1 (cdr lst))))))) 14 15 (defun n-elts (elt n) 16 (if (> n 1) 17 (list n elt) 18 elt))
^压缩
1 (defun uncompress (lst) 2 (if (null lst) 3 nil 4 (let ((elt (car lst)) 5 (rest (uncompress (cdr lst)))) 6 (if (consp elt) 7 (append (apply #' list-of elt) 8 rest) 9 (cons elt rest))))) 10 11 (defun list-of (n elt) 12 (if (zerop n) 13 nil 14 (cons elt (list-of (- n 1) elt))))
^解压缩
作者意见:这种写法不是一个有经验的Lisp程序员用的写法。它的效率很差,它没有尽可能的压缩,而且它只对由原子组成的列表有效。