typestar

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

  1. split-seconds llama a (floor total 60) dentro de multiple-value-bind y devuelve ambas partes con values.
  2. Quien llama las desempaca con otro multiple-value-bind e imprime ~d:~2,'0d.
  3. (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í

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.

Escribe este fragmento

Paso 3 de 3 en Funciones; paso 12 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →