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

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

字符串"foo"

符号'foo

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

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

最佳答案

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

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

(deftype square () '(satisfies squarep))


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

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

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


通过标识比较常量,可以定义:

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

关于common-lisp - 类型说明符可以将相等性指定为任意值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52123792/

10-14 20:10
查看更多