Common lisp 匿名CLOS实例

Common lisp 匿名CLOS实例,common-lisp,anonymous-class,Common Lisp,Anonymous Class,在Common Lisp中,是否有一种方言,可以像在Java中一样为一次性的“小型接口实现者”定义匿名类 比如说, this.addListener(new Listener() { public void listen() {...} }); 作为: (反通用侦听(对象)) (添加侦听器)# (匿名举例) (听(对象)…)) 在常见的Lisp中,方法属于泛型函数,而不是类,因此匿名实例实际上没有意义。根据具体情况、槽闭包或EQL专用程序,可以实现类似的目的 在回应评论时延长: 在CL

在Common Lisp中,是否有一种方言,可以像在Java中一样为一次性的“小型接口实现者”定义匿名类

比如说,

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

(反通用侦听(对象))
(添加侦听器)#
(匿名举例)
(听(对象)…))

在常见的Lisp中,方法属于泛型函数,而不是类,因此匿名实例实际上没有意义。根据具体情况、槽闭包或EQL专用程序,可以实现类似的目的

在回应评论时延长:

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


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

不太可能。尽管有了MOP和一些宏观学,这是可能的


在CLOS开发的早期阶段,有人提出了类似于
GENERIC-FLET
。Java中的匿名类几乎总是用来实现匿名函数和闭包。在CommonLisp中,不需要模拟Java的匿名内部类,因为函数是CommonLisp中的一类类型

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

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

好的,这很有道理,谢谢。我理解方法与泛型函数的关系。如果在原始示例中,由“#”表示的实例将调用通用函数“listen on listeners add by”add listener,您有什么建议?
(add-listener self (lambda (object) ...))