Lisp 用最后一个元素替换子列表

Lisp 用最后一个元素替换子列表,lisp,common-lisp,Lisp,Common Lisp,编写一个函数,用列表的最后一个元素替换列表的每个子列表。 子列表是来自第一级的元素,它是一个列表。 例如: (defun rep(list) (format t"~a~%" list) (cond ((null list) nil) ((atom (car list)) (cons (car list) (rep (cdr list)))) ((listp (car list)) (cons (car (reverse (car lis

编写一个函数,用列表的最后一个元素替换列表的每个子列表。 子列表是来自第一级的元素,它是一个列表。 例如:

(defun rep(list)
(format t"~a~%" list)
    (cond
        ((null list) nil)
        ((atom (car list)) (cons (car list) (rep  (cdr list))))
        ((listp (car list))  (cons (car (reverse (car list))) (cdr list)))
        (t (rep list))
    )
)
我有上述问题要解决。我只知道一点,但我被卡住了。
显然,它没有进入列表中的下一个元素,我不知道为什么。有什么想法吗?

我会这样分解:

(a (b c) (d (e (f)))) ==> (a c (e (f))) ==> (a c (f)) ==> (a c f)
     (a (b c) (d ((e) f))) ==> (a c ((e) f)) ==> (a c f)
然后


没有使用映射函数就完成了

(rep '(a (b c) (d (e (f)))))
=> '(A C F)

你能举例说明你的代码是怎么做的吗?在你的第三种情况下,汽车倒车列表本身可能是一个列表,所以它不会被完全处理。此外,cdr列表应替换为代表cdr列表,否则,它也不会被完全处理。或者,更简单一点的方法是将汽车倒车列表替换为汽车最后一个列表。谢谢,但我必须在没有地图功能的情况下完成它,而只需编写自己的地图功能;细分仍然适用。
(rep '(a (b c) (d (e (f)))))
=> '(A C F)
(defun rep(list)
    (cond
        ((null list) nil)
        ((listp (car list)) (rep (cons (car (reverse (car list))) (rep (cdr list)))))
        (t (cons (car list) (rep (cdr list))))
    )
)