【问题标题】:Can a type specifier, specify equality to an arbitrary value?类型说明符可以指定与任意值相等吗?
【发布时间】:2018-08-31 23:53:35
【问题描述】:

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

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

字符串"foo"?

符号'foo?

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

如果有,语法是什么?

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    您可以将任何您想要的谓词放在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+))
    

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多