在Common Lisp中,对于一次性的“小接口实现者”,有没有像Java那样定义匿名类的通用语言?
例如,
this.addListener(new Listener() {
public void listen() {...}
});作为:
(defgeneric listen (object))
(add-listener #<this>
(make-anonymous-instance
(listen (object) ...)))发布于 2012-02-23 01:50:44
在Common Lisp中,方法属于泛型函数,而不是类,因此匿名实例没有实际意义。根据具体情况,可以实现类似的目的,通过闭包或EQL特殊化器。
在对评论的响应中扩展:
在CL中定义不在顶层的方法是可能的,但不是一个好主意。我建议只添加正常的方法,如果不需要实际的实例,则可能是专门针对符号或其他常量的EQL。
如果定义内联行为通常是有用的,那么它表明接口设计错误,应该接受闭包而不是对象。如果你不能修复接口本身,那么你可以定义一个类,它的唯一目的是包装一个闭包,并添加一个调用该闭包的方法,然后只需创建一个具有适当行为插槽的实例。
发布于 2012-02-23 04:24:01
不怎么有意思。尽管有了拖把和一些宏观学,这可能是可能的。
在CLOS开发的早期阶段,有类似于GENERIC-FLET的提议。但它没有进入标准。
发布于 2012-02-23 05:26:03
Java中的匿名类几乎总是用来实现匿名函数和闭包。在common lisp中,不需要模拟Java的匿名内部类,因为function是Common Lisp中的一级类型。
如果是这样,那么Common Lisp中的代码将如下所示:
(add-listener self (lambda (object) ...))https://stackoverflow.com/questions/9398835
复制相似问题