给定一个内容为 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
这里有两个问题。
给定一个具有任意内容的变量,我如何确定它的父类(super class)型路径?
我在哪里可以在文档中找到这个问题的答案?
最佳答案
类型
你问的是类型,而不是类。
您不能指望对您的问题有一个好的答案,因为您的数字 1
所属的类型比您真正关心的要多得多。
例如,
(typep 1 '(integer -6 42))
==> T
如果您只关注 Standardized Atomic Type Specifiers , 你可以使用类似的东西
(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)
类
现在,如果您愿意将自己的兴趣限制在类,情况就会变得更易于管理。
首先,CLOS支持multiple inheritance ,所以“父类(super class)型路径”不是先验地唯一定义的。
但是,它必须被定义以确定 method precedence order ,这个“路径”叫做class precedence list .它是按标准计算的 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>)
它存在于大多数 Common Lisp 实现中(使用 apropos
或 find-all-symbols
查找它是从哪个包导出的)。
您可以使用 class-name
获取类的名称而不是它们的元对象:
(mapcar #'class-name (compute-class-precedence-list (class-of 1)))
==> (INTEGER RATIONAL REAL NUMBER T)
请注意 bit
, fixnum
, unsigned-byte
, signed-byte
, atom
不在此列表中,因为它们没有命名标准 classes , 只是 types .
关于lisp - 确定父类(super class)型路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19345733/