Lisp 什么是';元素';(元素列表)中的术语是什么意思?
我一直在学习有关common 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
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)