【发布时间】:2015-04-17 17:45:25
【问题描述】:
所以我试图让一个函数接收一个列表并将其反转,但我不确定如何使用RPLACA/RPLACD/NONC。基本上与 reverse 做同样的事情,但它使用原始列表的 cons 节点并且不分配任何新的 cons 节点。到目前为止我所拥有的是
(defun rip(lst)
(cond (( null lst) 0)
((eq (nil) (cdr (last lst))) 1)
(((setq x (car (last lst)))
(rplaca (car (last lst)) (car first lst))
(rplaca (car first lst) x)) + 2 rip(butlast(rest lst)))))
【问题讨论】:
-
欢迎来到stackoverflow。听起来您已经尝试过自己编写一些代码。您应该在问题中包含它,即使它不完整。它为我们提供了一个起点,并表明您做出了努力。
-
到目前为止,我没有使用任何必需的功能。 (defun reverse-in-place (l) (let ((result l)) (recurse reving ((ll) (r (reverse l)) (cond ((not (consp l)) result) (else (setf (car l) (car r)) (reving (cdr l) (cdr r))))))))
-
@John 你确定你使用的是 Common Lisp 吗?我认为
recurse和reving都不是语言中的东西。 -
对不起,我添加了错误的标签
-
@zck:RECURSE 是一个宏,例如在 Lisp Land of Lisp 一书中使用。那么 REVING 就是这里的代码 sn-p 中引入的名称。
标签: lisp land-of-lisp