将循环列表复制到固定长度列表

时间:2013-01-24 12:14:58

标签: common-lisp

我将图形坐标存储在循环列表中:

(defun make-circular-list (size &key initial-element)
  (let ((list (make-list size :initial-element initial-element)))
    (nconc list list)))

(defvar *coordinates* (make-circular-list 1024 :initial-element 0.0))

现在,只要必须设置新坐标,就可以轻松更新*coordinates*

但是,我有一个库函数,它采用一系列坐标在图形上绘制线条。当然这个函数不能用于循环结构,所以我想制作一个固定长度的副本。列表或数组很好。

到目前为止,我已使用subseq关键字尝试make-array:initial-contents,但失败了。 loopdotimes可以正常工作,但我希望避免迭代列表中的每个元素。

是否有可能有效地复制这个圆形结构或者在一个位移阵列的精神下制作一个固定长度的阵列?

1 个答案:

答案 0 :(得分:5)

使用LOOP没有任何问题。

(loop for c in *coordinates* repeat 1024 collect c)

顺便说一句,有时隐藏CLOS对象后面的循环列表可能很有用。

(defclass circular-list ()
   ((list)
    (size)
    (first-element)
    (last-element)))

等等......

通过这种方式,您可以提供一些CLOS方法来访问和更改它(创建,添加,复制,删除,按列表,...)。您还可以使用PRINT-OBJECT的方法控制打印。