首页 > 解决方案 > 类型说明符可以指定与任意值相等吗?

问题描述

Common Lisp 类型说明符似乎非常灵活,尽管我没有看到任何表明它们可以是任意谓词的东西(如果不是可以理解的,因为在一般情况下类型检查将是不确定的)。但是他们可以指定任意值的相等性吗?

一个整数?我认同; (integer 42 42)应该涵盖这一点。

字符串"foo"

符号'foo

获得的符号(defconstant foo (gensym))

如果是这样,语法是什么?

标签: common-lisp

解决方案


您可以将所需的任何谓词放在SATISFIES类型下。

(defun squarep (rect)
  (= (height rect) 
     (width rect)))

(deftype square () '(satisfies squarep))

这些类型不太可能在编译时得到验证。您需要使用这种类型来声明变量始终等于给定的字符串值或任何其他复杂数据。

对于与 可比较的值EQL,您可以使用EQLorMEMBER类型说明符。

(deftype foo-symbol () '(eql foo))
(deftype states () '(member :ready :working :error))

常量按身份进行比较,您可以定义:

(defconstant +foo+ (gensym))
(deftype foo-constant () `(eql ,+foo+))

推荐阅读