2011-03-01 62 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

相關問題