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