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