まず、次のようなコードを書くことは技術的に正しい (最も正しい)ことに注意してください。
(let ((wireList ()))
(dolist (x (table-wires inputTable) wireList)
…)
これはdolistが戻っていることを意味しwireListます。質問のタイトル「dolist ループからリストを返し、代わりに NIL を返す」は少し誤解を招きnil ます。(ii)返品する場合wireList。wireList問題は、 の実行中に実際に変更していないことですdolist。この関数consは単に新しいコンス セルを返します。場所を変更しないため、変更していませんwireList。push次のコードのように、代わりに を使用できます。elseif部分のないを使用しているため、 を使用できます。when
(defun table-wires-position(inputTable inputPosition)
(let ((wireList ()))
(dolist (x (table-wires inputTable) wireList)
(when (or (equal-position-p (wire-OriginCoin x) inputPosition)
(equal-position-p (wire-destinCoin x) inputPosition))
(push x wireList))))) ; or (setf wireList (cons x wireList))
スタイル ノードでは、この種の結果変数に変数を&aux使用することがよくあります。ネストのレベルを回避します。
(defun table-wires-position (inputTable inputPosition &aux (wireList '()))
(dolist (x (table-wires inputTable) wireList)
(when (or (equal-position-p (wire-OriginCoin x) inputPosition)
(equal-position-p (wire-destinCoin x) inputPosition))
(push x wireList))))
pushリストに要素を ing することで、 とは逆の順序で要素を取得していることに注意してくださいinputTable。(nreverse wireList)必要に応じて、代わりに戻ることで同じ順序でそれらを取得できます。さらに良いことに、実際には特定の要素が削除されたリストを返すだけなので、次のように使用することもできますremove-if-not。
(defun table-wires-position (inputTable inputPosition)
(remove-if-not #'(lambda (x)
(or (equal-position-p (wire-OriginCoin x) inputPosition)
(equal-position-p (wire-destinCoin x) inputPosition)))
inputTable))