我是一个有用的助手,可以为您翻译文本。
我一直在使用Common-lisp(SBCL)玩转循环列表,并在尝试调用REDUCE
函数时遇到了以下问题。
首先,我们创建一个列表:
CL-USER> (defvar *foo* (list 1 1 1 1))
*foo*
当然,现在我们可以做到。
CL-USER> (reduce #'+ *foo*)
4
或者
CL-USER> (reduce #'+ *foo* :end 3)
3
然而,如果我们创建一个循环列表:
CL-USER> (setf *print-circle* t)
CL-USER> (setf (cdr (last *foo*)) *foo*)
CL-USER> *foo*
#1=(1 1 1 1 . #1#)
(reduce #'+ *foo*)
明显不再返回结果。
但是当我尝试:
CL-USER> (reduce #'+ *foo* :end 3)
...
我也遇到了无限循环的问题。
为什么会这样?有没有办法在不显式使用
LOOP
或DO
之类的循环结构的情况下解决这个问题?我正在使用SBCL,但是我已经尝试过其他实现(CLISP、ECL),它们都有同样的问题。
(reduce #'+ *foo* :end 3)
将产生3
,而(reduce #'+ *foo*)
会发出一个[Condition of type CCL::IMPROPER-LIST]
信号。 - Renzo