Lisp 什么是';元素';(元素列表)中的术语是什么意思?

Lisp 什么是';元素';(元素列表)中的术语是什么意思?,lisp,common-lisp,Lisp,Common Lisp,我一直在学习有关common lisp的教程,刚刚学习了incf和dolist,我想看看我是否正确理解了dolist的功能,通过制作一个函数inc list,将列表中的每个元素增加一个: (defvar a-list(列表1、2、3)) (inc list a-list)=>(2 3 4) 下面是我如何定义inc列表的 (defun inc-list (list) (progn (dolist (element list) (incf element)) lis

我一直在学习有关common lisp的教程,刚刚学习了
incf
dolist
,我想看看我是否正确理解了dolist的功能,通过制作一个函数
inc list
,将列表中的每个元素增加一个:

(defvar a-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=>(13)
。如果不是因为这样做的话,这不会让我那么烦恼:

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

给我
a-list=>(2 3 4)
元素
的含义有什么秘密吗?

元素
依次绑定到列表中的每个元素,即每对元素的
car
值在某种意义上是“复制”到它的。然后,对
元素
调用
incf
,增加该变量的值,但不增加从中获取该变量的列表位置。就好像你在做

(defvar element (car a-list))
(incf element)
(setq element (cadr a-list))
(incf element)
(setq element (caddr a-list))
(incf element)
在这里,
元素
也会递增,然后每次都会立即“忘记”,因为它被设置为一个新值。相比之下,
(incf(car a-list))
增加了
a-list的
car
。如果您希望在循环中使用该行为,那么请忽略列表中的
dolist
loop:

(loop for position on lst
      do (incf (car position)))
旁注:不要这样编写全局变量。编写
*a-list*
。否则,全局动态变量会影响局部变量

(defun inc-list (list)
  (progn 
    (dolist (element list)
      (incf element))
    list))
您不需要
PROGN
DEFUN
已经允许一系列表单,就像
DOLIST
一样

(defun inc-list (list)
  (dolist (element list)
    (incf element))
  list)
以上就足够了

DOLIST
是一种形式,它引入了一个新的(!)局部变量,名为
ELEMENT

DOLIST
设置每个迭代中
元素的值。
您所要做的就是在每个迭代步骤中增加
元素
的值。 你的副作用消失了。原始列表没有更改。否则不使用
元素的值

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