<p>I find myself doing this sort of thing all the time.  I've been considering writing a macro/function to make this sort of thing easier, but it occurs to me that I'm probably reinventing the wheel.</p>

<p>Is there an existing function that will let me accomplish this same sort of thing more succinctly?</p>

<pre><code>(defun remove-low-words (word-list)   
  "Return a list with words of insufficient score removed."
  (let ((result nil))
    (dolist (word word-list)  
      (when (good-enough-score-p word) (push word result)))                                      
    result))  
</code></pre>

There are a couple ways you can do this.  First, and probably most easily, you can do it recursively.
```
```
(defun remove-low-words (word-list)
  (if (good-enough-score-p (car word-list))
      (list word (remove-low-words (cdr word-list)))
      (remove-low-words (cdr word-list))))
```
```
You could also do it with
```
mapcar
```
and
```
reduce
```
, where the former can construct you a list with failing elements replaced by
```
nil
```
and the latter can be used to filter out the
```
nil
```
.
Either would be a good candidate for a "filter" macro or function that takes a list and returns the list filtered by some predicate.