匿名CLOS实例

时间:2012-02-22 16:28:46

标签: common-lisp anonymous-class

在Common Lisp中,是否存在一种用于定义匿名类的方式,用于一次性“小型接口实现者”中的一个“小型接口实现者”?

例如,

this.addListener(new Listener() {
    public void listen() {...}
});

为:

(defgeneric listen (object))

(add-listener #<this>
  (make-anonymous-instance
    (listen (object) ...)))

3 个答案:

答案 0 :(得分:7)

Common Lisp方法属于泛型函数,而不是类,因此匿名实例并不真正有意义。根据具体情况,通过闭包或EQL专用器,可以实现类似的目的。

对评论进行了扩展:

在CL定义方法中,不是顶级方法是可能的,但不是一个好主意。我建议只是正常添加方法,如果不需要实际实例,可能EQL专门用于符号或其他常量。

如果定义行为内联更有用,那么它表明接口被错误设计并且应该采用闭包而不是对象。如果您无法修复接口本身,那么您可以定义一个类,其唯一目的是包装闭包并添加一个调用该闭包的方法,然后只创建一个具有适当行为的实例。

答案 1 :(得分:2)

不,真的。虽然有了MOP和一些宏观,但它可能是有可能的。

在CLOS开发的早期阶段,提出了类似GENERIC-FLET的内容。但它没有成为标准。

答案 2 :(得分:2)

Java中的匿名类几乎总是用于实现匿名函数和闭包。在常见的lisp中,没有必要模拟Java的匿名内部类,因为函数是Common Lisp中的第一类类型。

如果是这种情况,则Common Lisp中的代码如下所示:

(add-listener self (lambda (object) ...))