What is the Common Lisp idiom for this:
Remove the elements in a list that don't satisfy a predicate and for those that do satisfy the predicate apply a function.
Is this the Common Lisp idiom:
mapcar applied to remove-if
The idiom would be MAPCAR over REMOVE-IF-NOT, since you want to keep elements that match the predicate. The -IF-NOT functions are deprecated according to the standard, but for Common Lisp deprecation is mostly meaningless1 and as such we rarely see anyone use COMPLEMENT with REMOVE-IF.
However most people would use a LOOP here:
(lambda (elements test function)
(loop
for e in elements
when (funcall test e)
collect (funcall function e)))
A possible problem with MAPCAR over REMOVE-IF-NOT is that it is going to allocate memory for a temporary list just to discard it after. You can call this premature optimisation, but if I wanted to use higher-order functions (e.g. because I want to work with generalised sequences instead of just lists), I would use MAP-INTO:
(lambda (elements test function)
(let ((tmp (remove-if-not test elements)))
(map-into tmp function tmp)))
1. "Everything that has been marked as deprecated can be considered un-deprecated since there won't be another standard.", R. Strandh (beach).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With