Das Idiom MAPCAR
über REMOVE-IF-NOT
sein würde, da Sie Elemente behalten wollen, die das Prädikat entsprechen. Die -IF-NOT
Funktionen sind veraltet nach dem Standard, aber für Common Lisp Deprecation ist meist bedeutungslos und als solche sehen wir selten jemand COMPLEMENT
mit REMOVE-IF
verwenden.
Allerdings würden die meisten Menschen ein LOOP
hier verwenden:
(lambda (elements test function)
(loop
for e in elements
when (funcall test e)
collect (funcall function e)))
Ein mögliches Problem mit MAPCAR
über REMOVE-IF-NOT
ist, dass es Speicher für eine temporäre Liste zuweisen wird es einfach nach zu verwerfen. Sie können diese vorzeitige Optimierung nennen, aber wenn ich Funktionen höherer Ordnung (zum Beispiel, weil ich mit generali Sequenzen statt nur Listen arbeiten wollen) verwenden wollte, würde ich MAP-INTO
verwenden:
(lambda (elements test function)
(let ((tmp (remove-if-not test elements)))
(map-into tmp function tmp)))
1. "Alles, was als veraltet markiert wurde, kann als nicht veraltet angesehen werden, da es keinen anderen Standard geben wird.", R. Strandh (beach).
ja es ist mapcar über remove-if – ejbs