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
invoiceymemoheredantitlede la clase basedocument.defgeneric summarizedeclara el contrato; cada método se especializa en(item invoice)o(item memo).- El
dolistfinal llama asummarizecon uno de cada uno y obtiene salida distinta por clase.
Palabras clave y builtins usados aquí
defclassdefgenericdefmethoddolistformatlengthlist
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.
Paso 3 de 3 en Estructuras y CLOS; paso 21 de 27 en Fundamentos del lenguaje.