Valores múltiples en Lisp
Parte un tiempo de vuelta en minutos y segundos, y luego contrasta floor con truncate.
;; A form can return several values: VALUES packages them up and
;; MULTIPLE-VALUE-BIND takes them apart again.
(defun split-seconds (total)
"Return TOTAL seconds as whole minutes and leftover seconds."
(multiple-value-bind (minutes rest) (floor total 60)
(values minutes rest)))
(multiple-value-bind (minutes seconds) (split-seconds 227)
(format t "lap time ~d:~2,'0d~%" minutes seconds))
;; FLOOR rounds down and TRUNCATE rounds toward zero, so the two
;; disagree on negative numbers. NTH-VALUE picks out the remainder.
(format t "floor ~a ~a~%" (floor -7 2) (nth-value 1 (floor -7 2)))
(format t "truncate ~a ~a~%" (truncate -7 2) (nth-value 1 (truncate -7 2)))
Cómo funciona
split-secondsllama a(floor total 60)dentro demultiple-value-bindy devuelve ambas partes convalues.- Quien llama las desempaca con otro
multiple-value-binde imprime~d:~2,'0d. (floor -7 2)y(truncate -7 2)difieren con negativos;(nth-value 1 (floor -7 2))saca el resto.
Palabras clave y builtins usados aquí
defunfloorformatresttruncatevalues
El intento, en números
- Líneas
- 14
- Caracteres a escribir
- 670
- Tokens
- 85
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 73 segundos.
Paso 3 de 3 en Funciones; paso 12 de 27 en Fundamentos del lenguaje.