typestar

Funciones genéricas en Lisp

Un defgeneric, dos cuerpos defmethod, y la clase del argumento elige cuál de los dos corre.

;; One generic function, two methods, dispatch chosen by argument class.

(defclass document () ((title :initarg :title :accessor doc-title)))
(defclass invoice (document) ((total :initarg :total :accessor total-of)))
(defclass memo (document) ((body :initarg :body :accessor body-of)))

(defgeneric summarize (item)
  (:documentation "Return a one-line summary string for ITEM."))

(defmethod summarize ((item invoice))
  (format nil "~a: ~$ due" (doc-title item) (total-of item)))

(defmethod summarize ((item memo))
  (format nil "~a: ~d characters" (doc-title item) (length (body-of item))))

(dolist (item (list (make-instance 'invoice :title "Q3" :total 240.5)
                    (make-instance 'memo :title "Standup" :body "ship it")))
  (format t "~a~%" (summarize item)))

Cómo funciona

  1. invoice y memo heredan title de la clase base document.
  2. defgeneric summarize declara el contrato; cada método se especializa en (item invoice) o (item memo).
  3. El dolist final llama a summarize con uno de cada uno y obtiene salida distinta por clase.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
18
Caracteres a escribir
753
Tokens
142
Ritmo de tres estrellas
70 tpm

Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 122 segundos.

Escribe este fragmento

Paso 3 de 3 en Estructuras y CLOS; paso 21 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →