这个函数不应该返回列表中的所有元素吗?

时间:2011-03-01 07:39:42

标签: lisp common-lisp

(defun r (list)
  (let ((o ()))
    (dolist (x list o)
      (cons o x))))

(r (list 1 2 3))

没有。它返回nil

4 个答案:

答案 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)

如果是,请注意以下事项:

  • dolistx分配list(dolist (x list) ...
  • 必须设置
  • o(setf o (...
  • o必须“退回”