Common Lisp类型说明符似乎非常灵活,虽然我没有看到任何表明它们可以是任意谓词的东西(如果没有可以理解,因为在一般情况下类型检查将是不可判定的).但他们可以指定任意值的相等吗?
整数?我认同; (integer 42 42)应该涵盖那个.
字符串"foo"?
符号'foo?
获得的符号是(defconstant foo (gensym))?
如果是这样,语法是什么?
您可以在SATISFIES类型下放置任何您想要的谓词.
(defun squarep (rect)
(= (height rect)
(width rect)))
(deftype square () '(satisfies squarep))
Run Code Online (Sandbox Code Playgroud)
这些类型不太可能在编译时验证.您需要使用这样的类型来声明变量始终等于给定的字符串值或任何其他复杂数据.
对于可比较的值,EQL可以使用EQL或MEMBER类型说明符.
(deftype foo-symbol () '(eql foo))
(deftype states () '(member :ready :working :error))
Run Code Online (Sandbox Code Playgroud)
常量按身份进行比较,您可以定义:
(defconstant +foo+ (gensym))
(deftype foo-constant () `(eql ,+foo+))
Run Code Online (Sandbox Code Playgroud)