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)
这里有两个问题.
给定具有任意内容的变量,如何确定其超类型路径?
我在哪里可以在文档中找到答案?
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实现中(使用apropos或find-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不在此名单,因为他们不名标类,只是类型.