typestar

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

  1. (sort (copy-list *wheels*) #'< :key #'cdr) ordena por peso y evita que *wheels* se reacomode.
  2. (sort (copy-list *wheels*) #'string< :key #'car) cambia a un predicado de cadenas y lee la otra mitad del cons.
  3. (car (last *by-weight*)) saca la rueda más pesada del extremo ordenado.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior Siguiente →