确定超类型路径

Bil*_*osa 5 lisp clisp common-lisp gnu-common-lisp

给定内容为1的变量,我知道它是至少五种类型的成员:

 1 (let* ((fred 1))
 2   (princ (typep fred 'bit)) (terpri)
 3   (princ (typep fred 'integer)) (terpri)
 4   (princ (typep fred 'fixnum)) (terpri)
 5   (princ (typep fred 'rational)) (terpri)
 6   (princ (typep fred t)) (terpri))
T
T
T
T
T
Run Code Online (Sandbox Code Playgroud)

这里有两个问题.

  1. 给定具有任意内容的变量,如何确定其超类型路径?

  2. 我在哪里可以在文档中找到答案?

sds*_*sds 12

类型

你问的是类型,而不是.您不能期望对您的问题有一个好的答案,因为您的号码1所属的类型远远超过您真正关心的类型.例如,

(typep 1 '(integer -6 42))
==> T
Run Code Online (Sandbox Code Playgroud)

如果您将注意力限制在标准化原子类型说明符上,则可以使用类似的内容

(defconstant *Standardized-Atomic-Type-Specifiers* ...) ; see Figure 4-2
(sort (remove-if-not (lambda (type) (typep 1 type)) 
                     *Standardized-Atomic-Type-Specifiers*)
      #'subtypep)
==> (BIT FIXNUM UNSIGNED-BYTE SIGNED-BYTE INTEGER RATIONAL REAL NUMBER ATOM T)
Run Code Online (Sandbox Code Playgroud)

现在,如果您愿意限制您对课程的兴趣,情况会变得更易于管理.

首先,CLOS支持多重继承,因此"超类型路径"不是先验唯一定义的.

然而,被定义来确定方法优先顺序,而这个"道"被称为类优先级表.它由标准MOP函数计算compute-class-precedence-list:

(compute-class-precedence-list (class-of 1))
==> (#<BUILT-IN-CLASS INTEGER> #<BUILT-IN-CLASS RATIONAL> #<BUILT-IN-CLASS REAL>
     #<BUILT-IN-CLASS NUMBER> #<BUILT-IN-CLASS T>)
Run Code Online (Sandbox Code Playgroud)

它存在于大多数Common Lisp实现中(使用aproposfind-all-symbols查找从中导出的包).

您可以使用class-name获取类的名称而不是它们的元对象:

(mapcar #'class-name (compute-class-precedence-list (class-of 1)))
==> (INTEGER RATIONAL REAL NUMBER T)
Run Code Online (Sandbox Code Playgroud)

需要注意的是bit,fixnum,unsigned-byte,signed-byte,atom不在此名单,因为他们不名标,只是类型.