Filtrar con predicados en Lisp
Filtra una lista de conteos de aves de tres formas y cuenta una cuarta, sin tocar la lista original.
;; REMOVE-IF drops the elements a predicate accepts; REMOVE-IF-NOT
;; keeps them. Both return a fresh list and leave the input alone.
(defvar *sightings* '(3 12 7 20 5 8 15))
(defvar *odd-counts* (remove-if #'evenp *sightings*))
(defvar *even-counts* (remove-if-not #'evenp *sightings*))
;; A lambda serves anywhere a named predicate does.
(defvar *flocks* (remove-if (lambda (n) (< n 10)) *sightings*))
;; COUNT-IF answers how many match without building a new list.
(defvar *big-days* (count-if (lambda (n) (>= n 10)) *sightings*))
(format t "odd ~a~%even ~a~%" *odd-counts* *even-counts*)
(format t "flocks ~a on ~a days~%" *flocks* *big-days*)
Cómo funciona
(remove-if #'evenp *sightings*)descarta las coincidencias y(remove-if-not #'evenp *sightings*)las conserva.(remove-if (lambda (n) (< n 10)) *sightings*)muestra una lambda en la ranura del predicado.(count-if (lambda (n) (>= n 10)) *sightings*)devuelve un conteo en vez de una lista nueva.
Palabras clave y builtins usados aquí
defvarevenpformatlambda
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 651
- Tokens
- 90
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 77 segundos.
Paso 2 de 3 en Orden superior; paso 14 de 27 en Fundamentos del lenguaje.