Enums Common Lisp中的可比较(可分级/可排序)枚举

Enums Common Lisp中的可比较(可分级/可排序)枚举,enums,common-lisp,Enums,Common Lisp,我想知道是否有任何技巧或库可以在CommonLisp中获得可分级的枚举 一般来说,我定义了一组这样的枚举 (deftype weekdays() '(member :sunday :monday :tuesday :wednesday :thursday :friday :saturday)) 当然,我可以比较包含相同工作日的两个变量,例如,如果两者都包含:星期三 但是我想比较两个不同的工作日,比如“星期四比星期一晚吗”?这让我回到了常数 (defconstant +sunday+ 0

我想知道是否有任何技巧或库可以在CommonLisp中获得可分级的枚举

一般来说,我定义了一组这样的枚举

(deftype weekdays()
    '(member :sunday :monday :tuesday :wednesday :thursday :friday :saturday))
当然,我可以比较包含相同工作日的两个变量,例如,如果两者都包含:星期三

但是我想比较两个不同的工作日,比如“星期四比星期一晚吗”?这让我回到了常数

(defconstant +sunday+ 0)
(defconstant +monday+ 1)
and so on...
但这似乎是一种糟糕的风格


执行此操作的最佳实践是什么?

如果在单独的列表中定义元素,则可以按位置对其进行比较:

(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*)))
(定义参数*天)*
(星期日:星期一:星期二:星期三:星期四:星期五:星期六)
“表示一周中几天的关键字。”)
(日期)
“表示天的类型。天是列表*天*的一个元素”
`(成员,@*天*)
(德芬日<(第1天第2天)
根据,如果一周中的第1天早于第2天,则返回true
在*天*中指定的顺序
(<(职位第1天*天*)
(职位日期2*天*))
(键入:星期一);=>T
(typep:fooday'day);=>无
(日<:星期一:星期五);=>T
(日<:星期四:星期二);=>无

一般来说,对于枚举,答案可以解决这一问题,但对于一周中的几天,值得考虑如何解决,比如说
工作日-
(typep :monday 'day) ;=> T
(typep :fooday 'day) ;=> NIL

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