まず、次のようなコードを書くことは技術的に正しい (最も正しい)ことに注意してください。
(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))