2011-03-01 60 views
2
(defun r (list) 
    (let ((o())) 
    (dolist (x list o) 
     (cons o x)))) 

(r (list 1 2 3)) 

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

+0

什么是你想用'(dolist(X列表O)做......'?好像一个错字。 – Eelvex 2011-03-01 07:46:14

+0

此外,您可能意味着' (dolphin(x list)...') – Eelvex 2011-03-01 07:47:46

+0

'dolist'中的拼写错误是什么? – nakiya 2011-03-01 07:56:51

回答

3

您需要更改某处。例如PUSH具有所需的副作用。 CONS没有。

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

> (r (list 1 2 3)) 
(3 2 1) 
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分配xlist(dolist (x list) ...
  • o必须设置:(setf o (...
  • o必须是 “返回”
+0

(dolist(x list o)...)返回o – 2011-03-01 08:10:48

+0

@Rainer:是的,我知道:)我问OP是怎么做的...... – Eelvex 2011-03-01 08:14:08

2

您的dolist块返回变量o的最终值。变量o最初分配为nil,然后不会更改。

您可能想在循环内使用push而不是cons

1

列表不过是一个cons单元格的链表,以nil值结尾。例如(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)))) 
+0

对不起,错字:“试图用零开始构建” – LakatosI 2011-03-03 12:13:01

相关问题