lisp - 确定父类(super class)型路径

标签 lisp common-lisp clisp 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

这里有两个问题。

  1. 给定一个具有任意内容的变量,我如何确定它的父类(super class)型路径?

  2. 我在哪里可以在文档中找到这个问题的答案?

最佳答案

类型

你问的是类型,而不是。 您不能指望对您的问题有一个好的答案,因为您的数字 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 实现中(使用 aproposfind-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/

相关文章:

lisp - CLISP 中忽略了 DYNAMIC-EXTENT?

list - 如何检查列表中的所有数字是否都在稳步增加?

vim - slimv + vim : slimv ignores vim tab settings

Lisp:如何获得最终的循环值?

lisp - 如何使用 SBCL 的 SB-SPROF 分配分析?

lisp - 无法理解 LISP 中的一段代码

if-statement - clisp 在中缀、后缀、前缀之间转换(我正在尝试 if 语句)

common-lisp - 常见的Lisp : Why does my tail-recursive function cause a stack overflow?

data-structures - Common Lisp 的优先级队列?

floating-point - 如何以可移植的方式将 float 四舍五入到特定位数