4

Common Lispで非再帰的MAPCARにと同等の関数を実装するために関数を使用するにはどうすればよいですか?REMOVE-IF

4

1 に答える 1

4

では、常に入力と同じ長さのリストが返されるため、これは不可能MAPCARです (入力要素の一部が述語を満たす場合は、より短いリストが必要です)。

しかし、関連する機能で可能MAPCANです。もし、あんたが

  1. 各要素に述語を適用しますX
    • X述語を満たす場合、置換(X)
    • X述語を満たさない場合は、NIL
  2. 結果のリストを連結する

必要に応じて、述語を満たさなかった要素を含むリストが得られます。

MAPCANステップ 1 を実装する関数を指定すると、これらの操作が結合されます。

例:

(defun list-if-not (pred)
  (lambda (x) (if (funcall pred x) nil (list x))))

(defun my-remove-if (pred lst)
  (mapcan (list-if-not pred) lst))

(my-remove-if #'evenp '(1 2 3 4 5))

==>(1 3 5)

MAPCAR単独ではこれを行うことはできませんが、NCONC(またはAPPEND) と組み合わせて同じ結果を得ることができます。

(defun my-remove-if (pred lst)
  (apply #'nconc (mapcar (list-if-not pred) lst)))
于 2012-11-07T12:37:11.230 に答える