匿名CLOS实例

now*_*mja 2 common-lisp anonymous-class

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

例如,

this.addListener(new Listener() {
    public void listen() {...}
});
Run Code Online (Sandbox Code Playgroud)

如:

(defgeneric listen (object))

(add-listener #<this>
  (make-anonymous-instance
    (listen (object) ...)))
Run Code Online (Sandbox Code Playgroud)

Ram*_*ren 7

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

扩展以回应评论:

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

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