Common Lisp:如何检查某物是否是类型说明符?

Common Lisp: How to check if something is a type specifier?

我一直找不到任何内置方法来检查某物是否是有效的类型说明符。

这样的谓词存在吗?

(我会自己做一个,但是,唉,将不是类型说明符的东西传递给 typep 的后果是未定义的。根据 hyperspec,check-type 没有异常情况。)

您可以使用 Tomohiro Matsuyama 的 trivial-types 系统 (LLGPL),它定义了一些 implementation-specific 谓词的包装器:

(defun type-specifier-p (type-specifier)
  "Returns true if TYPE-SPECIFIER is a valid type specfiier."
  (or (documentation type-specifier 'type)
      #+sbcl (sb-ext:valid-type-specifier-p type-specifier)
      #+openmcl (ccl:type-specifier-p type-specifier)
      #+ecl (c::valid-type-specifier type-specifier)))

要扩展 to support CLISP,请使用

#+clisp (null (nth-value 1 (ignore-errors (ext:type-expand type-specifier))))

参见Type Specifiers