2011-11-12 55 views
4

我一直在通過一個關於常見lisp的教程,並且我剛剛被介紹到incfdolist,我想看看是否通過使函數inc-list正確地理解dolist函數的方式來增加列表中的每個元素由一個:(dolist(element list)...)中的'element'項是什麼意思?

(defvar a-list (list 1 2 3))

(inc-list a-list) => (2 3 4)

這是我如何定義INC名單

(defun inc-list (list) 
    (progn 
    (dolist (element list) 
     (incf element)) 
    list)) 

這似乎不起作用。當我嘗試(inc-list a-list)時,我回到(1 2 3)a-list => (1 2 3)。這不會打擾我一樣多,如果它是不是事實,這樣做:

(incf (car a-list)) 
(incf (cadr a-list)) 
(incf (caddr a-list)) 

給我a-list => (2 3 4)element是什麼意思?

回答

4

element依次與列表中的每個元素相關聯,即每個對的car的值在某種意義上被「複製」給它。然後,incf被調用element,遞增該變量的值,但是不是從取得的列表位置。這是因爲如果你做

(defvar element (car a-list)) 
(incf element) 
(setq element (cadr a-list)) 
(incf element) 
(setq element (caddr a-list)) 
(incf element) 

這裏也element遞增,然後立即「遺忘」,每次,因爲它是setq倒是到一個新的價值。相反,(incf (car a-list))遞增 就地car。如果你想在一個循環的行爲,那就算了,而不是關於dolistloop on名單:

(loop for position on lst 
     do (incf (car position))) 
2
(defvar a-list (list 1 2 3)) 

旁註:不要寫這樣的全局變量。寫*a-list*。否則全局動態變量會影響你的局部變量。

(defun inc-list (list) 
    (progn 
    (dolist (element list) 
     (incf element)) 
    list)) 

您不需要PROGNDEFUN已經允許一系列形式,如DOLIST

(defun inc-list (list) 
    (dolist (element list) 
    (incf element)) 
    list) 

以上就足夠了。

DOLIST是一種引入名爲ELEMENT的新(!)局部變量的形式。

DOLIST在每次迭代中設置值ELEMENT。 您所做的只是在每個迭代步驟中遞增ELEMENT的值。 你的副作用丟失了。原始LIST不會更改。否則不使用ELEMENT的值。

相關問題