Common lisp 专门处理不使关键字成为类的Lisp的类型关键字的惯用方法

Common lisp 专门处理不使关键字成为类的Lisp的类型关键字的惯用方法,common-lisp,Common Lisp,在图4.8中列出了与预定义类型说明符相对应的一组类关键字“”不在其中。但它接着说,“可以扩展单个实现,以定义其他类型说明符来拥有相应的类” 所以我假设这就是Clozure CL对“关键字”类型说明符所做的,下面的代码似乎证明了这一点。在不这样做的Lisp中(例如,我检查过的SBCL和LispWorks),获得Clozure CL行为的最佳方法是什么?或者如果失败了,一些可行的妥协 正如我在下面的方法foo的第一个定义中所做的那样,显式地测试关键字类型似乎有点恶心,但是如果我的lisp实现还没有为

在图4.8中列出了与预定义类型说明符相对应的一组类关键字“”不在其中。但它接着说,“可以扩展单个实现,以定义其他类型说明符来拥有相应的类”

所以我假设这就是Clozure CL对“关键字”类型说明符所做的,下面的代码似乎证明了这一点。在不这样做的Lisp中(例如,我检查过的SBCL和LispWorks),获得Clozure CL行为的最佳方法是什么?或者如果失败了,一些可行的妥协

正如我在下面的方法foo的第一个定义中所做的那样,显式地测试关键字类型似乎有点恶心,但是如果我的lisp实现还没有为我做过,我看不到如何将关键字类型变成一个类

(in-package :cl-user)

(defmethod foo ((sym symbol))
  (let ((type (if (keywordp sym) "keyword" "symbol")))
    (format t "symbol specializer with ~A: ~A~%" sym type)))

#+clozure (defmethod foo ((sym keyword))
            (format t "We have keyword ~A~%" sym))

;; SBCL
(foo 'bar) => symbol specializer with BAR: symbol
(foo :bar) => symbol specializer with BAR: keyword

;; Clozure CL
(foo 'bar) => symbol specializer with BAR: symbol
(foo :bar) => We have keyword BAR

ANSI Common Lisp未定义名称为
关键字的类。它是Clozure Common Lisp的非可移植扩展

也没有可移植的方法来引入这样一个类

由于
symbol
是一个内置类,因此不能使用子类对其进行扩展


因此,我认为简单的
IF
是丑陋的,但却是必要的。另一个解决方案将涉及更多内容(想象一下使用MOP引入一种新的方式,通过自己的并行类结构对类型进行分派…。

我听到您明确的“否”,所以在这种情况下,我真的想问最好的解决方法是什么。。。(而且,这只是一个诡辩,不是CLHS文件)