常见的Lisp类型说明符似乎很灵活,尽管我还没有看到任何表明它们可以是任意谓词的方法(如果不能理解,这是可以理解的,因为在一般情况下类型检查是无法确定的)。但是他们可以将相等性指定为任意值吗?
一个整数?我认同; (integer 42 42)
应该涵盖了这一点。
字符串"foo"
?
符号'foo
?
由(defconstant foo (gensym))
获得的符号?
如果是这样,语法是什么?
答案 0 :(得分:5)
您可以将任何谓词置于SATISFIES
类型下。
(defun squarep (rect)
(= (height rect)
(width rect)))
(deftype square () '(satisfies squarep))
这些类型不太可能在编译时进行验证。 您将需要使用这种类型来声明变量始终等于给定的字符串值或任何其他复杂数据。
对于与EQL
具有可比性的值,可以使用EQL
或MEMBER
类型说明符。
(deftype foo-symbol () '(eql foo))
(deftype states () '(member :ready :working :error))
按身份比较常量,您可以定义:
(defconstant +foo+ (gensym))
(deftype foo-constant () `(eql ,+foo+))