(defun r (list)
(let ((o ()))
(dolist (x list o)
(cons o x))))
(r (list 1 2 3))
没有。它返回nil
答案 0 :(得分:3)
您需要在某处更改 o 。例如,PUSH具有所需的副作用。 CONS没有。
(defun r (list)
(let ((o ()))
(dolist (x list o)
(push x o))))
> (r (list 1 2 3))
(3 2 1)
答案 1 :(得分:2)
您的dolist
块返回变量o
的最终值。您的变量o
最初被指定为nil
,然后永远不会更改。
您可能希望在循环中使用push
而不是cons
。
答案 2 :(得分:1)
列表只不过是一个cons小区的链表,以零值结尾。 例如(1 2 3)相当于(cons 1(cons 2(cons 3 nil)))
你的代码设计是错误的,因为你试图用nil构建的是空列表,然后你试图将其他元素包含在内。您正在尝试做的更正版本将是
(defun r (list)
(let ((o ()))
(dolist (el list o)
(setf o (cons el o))))
答案 3 :(得分:0)
你想做这样的事吗?
(defun r(list)
(let ((o ()))
(dolist (x list)
(setf o (cons o x)))
o))
(r (list 1 2 3))
(((NIL . 1) . 2) . 3)
如果是,请注意以下事项:
dolist
从x
分配list
:(dolist (x list) ...
o
:(setf o (...
o
必须“退回”