Common Lispで非再帰的MAPCAR
にと同等の関数を実装するために関数を使用するにはどうすればよいですか?REMOVE-IF
1442 次
1 に答える
4
では、常に入力と同じ長さのリストが返されるため、これは不可能MAPCAR
です (入力要素の一部が述語を満たす場合は、より短いリストが必要です)。
しかし、関連する機能で可能MAPCAN
です。もし、あんたが
- 各要素に述語を適用します
X
。X
述語を満たす場合、置換(X)
X
述語を満たさない場合は、NIL
- 結果のリストを連結する
必要に応じて、述語を満たさなかった要素を含むリストが得られます。
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 に答える