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

时间:2014-04-08 01:35:22

标签: 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

1 个答案:

答案 0 :(得分:6)

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

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

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

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