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-contentsloopdotimes

この円形の構造を効率的にコピーしたり、変位した配列の精神で固定長の配列を作成したりすることは可能ですか?

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 に答える