习惯于专门针对不使关键字成为类的lisps的类型关键字的方法

gto*_*tod 5 common-lisp

CLHS 4.3.7中,图4.8列出了与预定义类型说明符对应的类集."关键字"不在其中.但它继续说"可以扩展单个实现以定义其他类型说明符以具有相应的类".

所以我认为这就是Clozure CL为'keyword'类型说明符所做的事情,下面的代码似乎证实了这一点.在没有这样做的lisps中(例如我已经检查过的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
Run Code Online (Sandbox Code Playgroud)

Rai*_*wig 6

ANSI Common Lisp没有定义名称的类KEYWORD.它是Clozure Common Lisp的非可移植扩展.

也没有可移植的方式来介绍这样的课程.

由于symbol是内置类,因此无法使用子类扩展它.

所以我认为简单IF是丑陋的,但却是必要的.另一个解决方案将涉及更多(想象一下使用MOP引入一种新方法来调度类型的自己的并行类结构......).