Por ejemplo, usted desea asignar un nombre tamaños de fuente:
(defconstant +large+ 3)
(defconstant +medium+ 2)
(defconstant +small+ 1)
Se puede escribir una macro para hacerlo más corto.
Las definiciones sobre constante se escriben SÓLO cuando estos números se deben pasar a algún código externo no Lisp.
De lo contrario, uno solo usaría símbolos de palabra clave:: grande,: mediano y: pequeño.
Puede probarlos con EQ y todo lo que utiliza alguna prueba de igualdad.
(let ((size :medium))
(ecase size
(:small ...)
(:medium ...)
(:large ...)))
También puede escribir métodos para ello:
(defmethod draw-string (message x y (size (eql :large))) ...)
Como se ha mencionado que podría definir un tipo de conjunto:
(deftype size() '(member :small :medium :large))
entonces usted puede comprobar si algo es o bien de los que:
(let ((my-size :medium))
(check-type my-size size))
Above would señalizar un error si my-size no es uno de: small,: medium o: large.
También puede usar el tipo en una forma defclass:
(defclass vehicle()
((width :type size :initarg :width)))
Ahora debe crear objetos como aquí:
(make-instance 'vehicle :width :large)
Algunas implementaciones de Common Lisp comprobarán cuando se establece la ranura hasta cierto valor ilegal
Si ahora crea objetos del vehículo de clase, las ranuras serán una de: grande, mediana o pequeña. Si miras el objeto en un depurador, inspector u otra herramienta, verás los nombres simbólicos y no 1, 2 o 3 (o los valores que normalmente usarías).
Esto es parte del estilo Lisp: utilice nombres simbólicos cuando sea posible. Use símbolos con valores numéricos solo en el código de interfaz para funciones extranjeras (como llamar al código C externo que usa enumeraciones).
Sí, pero es mejor usar palabras clave. – kmkaplan
Ese es un buen punto: al usar la palabra clave, evita tener que preocuparse sobre en qué paquete están sus símbolos. –
En realidad, las funciones genéricas solo pueden especializarse en clases, no en tipos arbitrarios. –