在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)
ANSI Common Lisp没有定义名称的类KEYWORD.它是Clozure Common Lisp的非可移植扩展.
也没有可移植的方式来介绍这样的课程.
由于symbol是内置类,因此无法使用子类扩展它.
所以我认为简单IF是丑陋的,但却是必要的.另一个解决方案将涉及更多(想象一下使用MOP引入一种新方法来调度类型的自己的并行类结构......).