我将图形坐标存储在循环列表中:
(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))
Run Code Online (Sandbox Code Playgroud)
现在,*coordinates*只要必须设置新坐标,就可以轻松更新.
但是,我有一个库函数,它采用一系列坐标在图形上绘制线条.当然这个函数不能用于循环结构,所以我想制作一个固定长度的副本.列表或数组很好.
到目前为止,我曾尝试subseq和make-array与:initial-contents关键字,但它失败. loop或者dotimes做工作,但我希望避免迭代列表中的每个元素.
是否有可能有效地复制这个圆形结构或者在移位阵列的精神下制作一个固定长度的阵列?
使用LOOP没有任何问题.
(loop for c in *coordinates* repeat 1024 collect c)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,有时隐藏CLOS对象后面的循环列表可能会有用.
(defclass circular-list ()
((list)
(size)
(first-element)
(last-element)))
Run Code Online (Sandbox Code Playgroud)
等等...
这样,您可以提供一些CLOS方法来访问和更改它(创建,添加,复制,删除,按列表,...).您还可以使用方法控制打印PRINT-OBJECT.