2012-02-22 29 views
2

Common Lisp中是否有一种白话,用于定义匿名类,以Java的方式来定义一次性'小接口实现者'?匿名CLOS实例

例如,

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

为:

(defgeneric listen (object)) 

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

回答

7

在Common Lisp的方法属于通用的功能,而不是类,因此匿名的情况下,也没有真正意义。根据具体情况,可以实现类似的目的,槽闭合或EQL专业人员。

扩展响应评论:

在顶级

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

如果定义内联行为通常比较有用,那么它表示接口是错误设计的,应该采用闭包而不是对象。如果你无法修复接口本身,那么你可以定义一个只用于封装闭包并添加一个调用闭包的方法的类,然后只需创建一个具有适当行为的实例。

+0

好吧,这是有道理的,这样的感谢。我理解方法与泛型函数的关系。如果在原始示例中,由'#'表示的实例将调用通用函数'侦听添加侦听器添加的侦听器,那么您会提出什么建议? – nowbumja 2012-02-22 18:04:52

2

确实没有。虽然有了MOP和一些宏观学,但它可能是可能的。

在CLOS发展的早期阶段,有像GENERIC-FLET这样的建议。但它没有达到标准。

2

Java中的匿名类几乎总是用来实现匿名函数和闭包。在通常的lisp中,不需要模拟Java的匿名内部类,因为函数是Common Lisp中的第一类类型。

如果是这种情况,那么在Common Lisp的代码看起来像:

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