【问题标题】:Idiomatic way to specialize on type keyword for lisps that do not make keyword a class专注于不使关键字成为类的 lisps 的类型关键字的惯用方法
【发布时间】:2014-04-08 01:35:22
【问题描述】:

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

所以我认为这是 Clozure CL 为“关键字”类型说明符所做的事情,下面的代码似乎证实了这一点。在不这样做的 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

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    ANSI Common Lisp 没有定义名称为KEYWORD 的类。它是 Clozure Common Lisp 的非便携扩展。

    也没有可移植的方式来引入这样的类。

    由于symbol 是一个内置类,您不能使用子类对其进行扩展。

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

    【讨论】:

    • 我听到你明确的“不”,所以在这种情况下,我真的在问最好的解决方法是什么......(另外,这只是一个小问题,不是 CLHS 文件@ 987654321@)
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-12-20
    • 2021-01-05
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多