typestar

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

  1. (remove-if #'evenp *sightings*) descarta las coincidencias y (remove-if-not #'evenp *sightings*) las conserva.
  2. (remove-if (lambda (n) (< n 10)) *sightings*) muestra una lambda en la ranura del predicado.
  3. (count-if (lambda (n) (>= n 10)) *sightings*) devuelve un conteo en vez de una lista nueva.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Orden superior; paso 14 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →