0

特定の ID を指定してボードから要素を削除する関数を Lisp で実行しようとしています。私のボードは 2 次元配列で、各位置には次のようなものがあります(value (id x y)(id x y)...(id x y))(id x y)id が関数呼び出しで指定された int と等しいすべてのトリプレットを削除する必要があります。
指定されたIDを持つ要素を除いて、ボードのコンテンツを新しいものにコピーする、おそらく非常に悪い解決策を思いつきました。コンソールでいくつかの例を実行してみましたが、正しい結果が返されますが、配列の内容は変更されません。関数の最後にあるセットは、まさにそれを行うはずではありませんか? また、コンソールの結果が変更されたボードであるTかどうかNILではないことを期待していました...

(defun remove-id (board int)
  (let ((lin (board-lines board))
        (col (board-columns board)))
    (let ((new-board (new-board lin col)))
      (dotimes (i lin)
        (dotimes (j col)
          (when (not (null (aref board i j)))
            (dolist (el (rest (aref board i j))
              (if (not (= (el-id el) int))
                (copy-content new-board (el-x el)(el-y el)))))))
      (setf board (copy-board new-board)))))

私が使用している関数はすべて正しく機能します。名前が一目瞭然であることを願っています。

4

1 に答える 1

1

あなたが探しているのは、関数の非破壊的なファミリーまたは破壊的なファミリーだと思います。そのうちの 1 つでループを置き換えることができます。remove delete dolist

より具体的には、次のようなことをする必要があります

(setf (board-content new-board x y) 
      (remove int (board-content old-board x y) :key #'car))

重要な部分は

  1. 引数 (それ以外の場合はではなく と:key比較intしています)(id ...)id
  2. setf呼び出し (removeシーケンス引数を変更しないため)

let(2 つの を 1つの に置き換えることもできますlet*)。

于 2013-11-11T14:32:21.047 に答える