lisp代码的说明

时间:2017-01-04 15:53:09

标签: lisp common-lisp

我开始研究Lisp,我在书上找到了一个代码作为示例,但我不明白它是什么。你能帮我理解吗?我不知道这是否适合这样做。谢谢大家

(defun compress (l1)               
  (cond ((null (cdr l1)) '())
        (t (accumula (car l1) 1 (cdr l1)))))


(defun accumula (val acc lst)
  (cond ((null lst) (cons (comp-list val acc) nil))
        ((eq val (car lst)) (accumula val (1+ acc) (cdr lst)))
        (t (cons (comp-list val acc) (accumula (car lst) 1 (cdr lst))))))

(defun comp-list (val acc)
  (if (> acc 1) (list acc val) val))

2 个答案:

答案 0 :(得分:1)

它是Run Length Encoding种类的压缩函数。

(compress '(3 3 4 3 3 2 1 1 1 1 0)) 

将产生

((2 3) 4 (2 3) 2 (4 1) 0)

其中每个子列表中的第一个数字是第二个数字在原始序列中重复的次数。

从示例中看起来并不多,但对于数字重复很多的长序列,您可以大大节省存储成本。

答案 1 :(得分:1)

这是The 99 Lisp problems(L99)中问题13的答案。它有一个错误:

(compress '(a))
; ==> nil

正确的结果是(a)