3

我将图形坐标存储在一个圆形列表中:

(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做工作,但我希望避免迭代列表的每个元素。

是否可以有效地复制这个循环结构或本着置换数组的精神制作一个固定长度的数组?

4

1 回答 1

5

使用 LOOP 没有任何问题。

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

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

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

等等...

这样,您可以提供一些 CLOS 方法来访问和更改它(创建、添加、复制、删除、...、as-list 等)。您还可以使用PRINT-OBJECT.

于 2013-01-24T12:43:23.530 回答