我是一个Lisp初学者,我写了一个函数来将列表中相邻的equal
项分组。如果Lisp专家能够给我一些有关更好的Lispy编写此函数的建议,我将不胜感激。提前致谢!
(defun identity-groups (lst)
(labels ((travel (tail group groups)
(cond ((endp tail) (cons group groups))
((equal (car tail) (car (last group)))
(travel (cdr tail) (cons (car tail) group) groups))
(t (travel (cdr tail) (list (car tail)) (cons group groups))))))
(reverse (travel (cdr lst) (list (car lst)) nil))))
(identity-groups '(1 3 5 4 4 4 4 5 1 2 2 2 1 2 3 3 3 3 3 4 5 6 7))
;; => ((1) (3) (5) (4 4 4 4) (5) (1) (2 2 2) (1) (2) (3 3 3 3 3) (4) (5) (6) (7))
(identity-groups '(1 3 5 4 5 1 2 1 2 3 4 5 6 7))
返回((7) (6) (2 2) (4 4) (5 5 5) (3 3) (1 1 1))
(也许分组顺序不同),但是您的函数目前并没有返回这样的结果,而是一列单元素列表:((1) (3) (5) (4) (5) (1) (2) (1) (2) (3) (4) (5) (6) (7))
。这是否符合预期? - coredump