首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匿名CLOS实例

匿名CLOS实例
EN

Stack Overflow用户
提问于 2012-02-23 00:28:46
回答 3查看 361关注 0票数 2

在Common Lisp中,对于一次性的“小接口实现者”,有没有像Java那样定义匿名类的通用语言?

例如,

代码语言:javascript
复制
this.addListener(new Listener() {
    public void listen() {...}
});

作为:

代码语言:javascript
复制
(defgeneric listen (object))

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 01:50:44

在Common Lisp中,方法属于泛型函数,而不是类,因此匿名实例没有实际意义。根据具体情况,可以实现类似的目的,通过闭包或EQL特殊化器。

在对评论的响应中扩展:

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

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

票数 7
EN

Stack Overflow用户

发布于 2012-02-23 04:24:01

不怎么有意思。尽管有了拖把和一些宏观学,这可能是可能的。

在CLOS开发的早期阶段,有类似于GENERIC-FLET的提议。但它没有进入标准。

票数 2
EN

Stack Overflow用户

发布于 2012-02-23 05:26:03

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

如果是这样,那么Common Lisp中的代码将如下所示:

代码语言:javascript
复制
(add-listener self (lambda (object) ...))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9398835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档