sort con :key en Lisp
Ordena un alist de quesos por peso y por nombre, copiando primero porque sort es destructivo.
;; SORT is destructive: it rearranges the sequence you hand it, so
;; pass a COPY-LIST whenever the original still matters.
(defvar *wheels*
'(("gouda" . 4200) ("brie" . 900) ("comte" . 12500)))
;; :KEY pulls the part to compare out of each element, and the
;; predicate then sees only that part.
(defvar *by-weight* (sort (copy-list *wheels*) #'< :key #'cdr))
(defvar *by-name* (sort (copy-list *wheels*) #'string< :key #'car))
(defvar *heaviest* (car (last *by-weight*)))
(format t "by weight ~a~%" (mapcar #'car *by-weight*))
(format t "by name ~a~%" (mapcar #'car *by-name*))
(format t "heaviest ~a at ~a g~%" (car *heaviest*) (cdr *heaviest*))
Cómo funciona
(sort (copy-list *wheels*) #'< :key #'cdr)ordena por peso y evita que*wheels*se reacomode.(sort (copy-list *wheels*) #'string< :key #'car)cambia a un predicado de cadenas y lee la otra mitad del cons.(car (last *by-weight*))saca la rueda más pesada del extremo ordenado.
Palabras clave y builtins usados aquí
carcdrdefvarformatlastmapcarsort
El intento, en números
- Líneas
- 14
- Caracteres a escribir
- 653
- Tokens
- 104
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 89 segundos.
Paso 3 de 3 en Orden superior; paso 15 de 27 en Fundamentos del lenguaje.