2017-07-18 4 views
3

Je me demande s'il y a une astuce ou une bibliothèque pour obtenir des énumérations classables dans Common Lisp.Enums comparables (Rankable/Sortable) en Common Lisp

En général, je définir un ensemble d'énumérations de ce type

(deftype weekdays() 
    '(member :sunday :monday :tuesday :wednesday :thursday :friday :saturday)) 

Certes, je peux comparer deux variables pour contenir le même jour de la semaine, par exemple, si les deux contiennent: mercredi.

Mais je veux comparer deux jours de la semaine différents comme "Est: jeudi après: lundi"? Cela me ramène à des constantes

(defconstant +sunday+ 0) 
(defconstant +monday+ 1) 
and so on... 

mais cela semble être de mauvais style.

Quelle est la meilleure pratique pour ce faire?

+0

Une adresse de réponse ceci pour énumérations en général, mais pour les jours de la semaine, il est utile d'envisager comment, disons 'jour de semaine- <', devrait fonctionner: il serait souhaitable que la fonction soit transitive (ie Si 'a

Répondre

3

Si vous définissez les éléments d'une liste séparée, vous pouvez simplement les comparer par la position:

(defparameter *days* 
    '(:sunday :monday :tuesday :wednesday :thursday :friday :saturday) 
    "Keywords indicating days of the week.") 

(deftype day() 
    "Type representing days. A day is an element of the list *DAYS*." 
    `(member ,@*days*)) 

(defun day< (day1 day2) 
    "Returns true if DAY1 is earlier in the week than DAY2, according to 
the order specified in *DAYS*." 
    (< (position day1 *days*) 
    (position day2 *days*))) 
(typep :monday 'day) ;=> T 
(typep :fooday 'day) ;=> NIL 

(day< :monday :friday) ;=> T 
(day< :thursday :tuesday) ;=> NIL