【发布时间】:2015-04-26 23:13:43
【问题描述】:
假设我运行以下命令
(loop for i to 4 collect i)
然后我得到一个列表(0 1 2 3 4)。现在,如果我想在结果中附加一些东西,我可以在它的last 元素上使用rplacd,但是由于Lisp 列表是链表,所以效率不是很高。这里的列表非常小,但这只是一个示例。
但是,由于循环工具以升序返回列表,它必须跟踪指向最后一个元素的指针,并使用rplacd 或等效的东西更新结果。 macroexpand-all 表明这是 CCL 所做的,可能还有其他 lisp。
问题:有没有办法在finally 子句中使用这个“指针”?它允许人们在结果中附加一些东西,这有时很有用。
当然,编写指针机制很容易,但它不是那么好。例如,以下内容会将列表 e 附加到列表 (0 1 ... n)。
(defun foo (n e)
(let* ((a (list nil)) (tail a))
(loop for i to n
do (rplacd tail (setf tail (list i)))
finally (rplacd tail (setf tail e))
(return (cdr a)))))
【问题讨论】:
标签: loops lisp common-lisp