1

私のコードで私を助けてくれませんか?なぜそれが私のwireListを返さないのかわかりません.NILを返すだけです.

(defun table-wires-position(inputTable inputPosition)
   (let ((wireList () ))
     (dolist (x (table-wires inputTable) wireList)
        (if (or (equal-position-p (wire-OriginCoin x) inputPosition) 
                (equal-position-p (wire-destinCoin x) inputPosition))
                   (cons x wireList)))))
4

3 に答える 3

7

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

(let ((wireList ()))
  (dolist (x (table-wires inputTable) wireList)
    …)

これはdolistが戻っていることを意味しwireListます。質問のタイトル「dolist ループからリストを返し、代わりに NIL を返す」は少し誤解を招きnil ます。(ii)返品する場合wireListwireList問題は、 の実行中に実際に変更していないことですdolist。この関数consは単に新しいコンス セルを返します。場所を変更しないため、変更していませんwireListpush次のコードのように、代わりに を使用できます。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))
于 2013-11-07T15:29:45.820 に答える
1

小さな追加:

doマクロがlike inで始まる場合dolist、それはただ反復し、反復は副作用のために行われます。したがって、必要に応じて反復結果をどこかに置くのはユーザーの仕事です。

本文のどこかで句を開始collectまたは許可する場合、反復結果のリストを返す必要があります。collectマクロはそのloopような構造ですが、図書館や本で他の反復構造を見つけるかもしれません。

于 2013-11-07T16:59:25.007 に答える