问题标签 [clos]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
741 浏览

prototype - Lisp 和 Scheme 存在哪些 POOP 框架

Lisp 和 Scheme 中有哪些不错的 POOP(基于原型的面向对象编程)框架?

我知道一个:羊

但是还有其他人吗?

0 投票
3 回答
2055 浏览

common-lisp - 根据 Common Lisp Object System 类定义中的其他槽值初始化槽

在我的类定义中,我想根据另一个插槽的值来初始化一个插槽。这是我想做的事情:

但是,这不会编译:

有没有办法做到这一点?

0 投票
2 回答
373 浏览

lisp - Lisp (CLOS) 中的槽访问问题

我有一个 Node 类,它有一个“元素”插槽,其中包含一个带有数字和一个字母的列表,例如:

'(1 2 3 b 4 5 6)

p>

程序的一部分应该使用“元素”槽,用其中一个数字交换字母,最后创建一个新的 Node 对象,并将交换的列表作为它的“元素”槽。我已经有一个交换函数,它接收一个列表和该列表的两个成员,并使用 rotatef 函数交换它们。

为了测试交换函数是否正常工作,我创建了以下代码,它将元素存储在临时变量中,并将字母“b”与列表中的数字交换:

p>

问题是根对象的“元素”插槽与临时交换。奇怪的是,我尝试将交换功能更改为反转,它不会修改两者中的任何一个。

我不知道是否有任何方法可以将插槽分配给变量或防止上述情况发生的方法。

谢谢。

0 投票
7 回答
4963 浏览

oop - Clojure 的 CLOS?

Clojure是否存在诸如CLOS(通用 Lisp 对象系统)之类的东西?

0 投票
2 回答
1853 浏览

lisp - 比较 Common Lisp 和 Gambit 的库访问和对象系统

我对 Gambit Scheme 非常感兴趣,尤其是它支持的广泛平台,以及它在需要时将 C 代码直接放入您的 Scheme 源代码的能力。也就是说,它是一个方案,与 Common Lisp 相比,它的“包含的电池”更少。有些人喜欢从头开始编写很多东西(又名有力的牦牛剃须),但我不喜欢!

这给我带来了两个问题,面向同时使用 Gambit 和一些 Common Lisp 风格的人:

1)哪个有效地更好地访问图书馆?Scheme 的库比 Common Lisp 少。然而,Gambit Scheme 可以更顺畅地访问 C/C++ 代码和库,这远远超过 Common Lisp 的库。在您看来,Gambit 的 FFI 的流畅性是否超过了它缺乏原生库?

2) Scheme 的对象系统(例如 TinyCLOS、Meroon)与 Common Lisp 的 CLOS 相比如何?如果您发现它们缺少,您最想念哪些功能?最后,首先,Lisp/Scheme 中的对象系统有多重要?我听说整个基于 lisp 的公司(例如 ITA Software)完全放弃了 CLOS。Lisp/Scheme 中的对象真的那么可选吗?我确实担心如果 Gambit 没有好的对象系统,我可能会错过它们(我的编程背景是纯面向对象的)。

感谢您帮助有抱负的 C++/Python 转换,

——马特

PS:有超过 1500 代表的人,你能创建一个“gambit”标签吗?:) 谢谢乔纳斯!

0 投票
1 回答
1516 浏览

oop - CLOS 相对于其他基于类的 OO 系统的优势

我遇到过这样的说法,即 Common Lisp 对象系统 (CLOS) 优于传统的(基于类的)面向对象系统。CLOS 的 Wikipedia 条目提到了这两种方法之间的差异——主要是多分派以及 CLOS 中的类和方法的分离。这些仅仅是CLOS的差异还是真正的优势?

0 投票
2 回答
635 浏览

lisp - lisp:如何在范围内创建临时方法特化

Common lisp 中:重新定义范围内的现有函数?OP要求类似的东西。但我想创建一个方法专门器,而不是一个函数。本质上假设一个方法是这样定义的:

我想做的是(伪代码):

真正的用途是我想创建一个临时环境,setf slot-value-using-class专门用于eql创建特定对象的按需截取其插槽写入。(目的是在某处记录新旧插槽值,然后调用 next 方法。)我不想创建元类,因为我可能想拦截已经实例化的标准对象。

当然,我试过了,但没有用(因为你是怎么做DEFMETHODLABELS?),但我希望一些更有经验的人来验证它以这种方式不可行和/或提出一种合适的方式。

注释?

编辑:

Daniel 和 Terje 提供了很好的链接,可以扩大我对可能性的了解,但我想在去那里之前再多推一点,寻找一种更普通的方法。我一直在考虑在进入环境时执行一个 add-method,该方法将专注于 eql,并在退出时执行一个 remove-method。我还没说完。如果有人玩过这些,评论会很好。将保持线程是最新的。

编辑 2:我很接近使用 add-method 场景来做到这一点,但有一个问题。这是我尝试过的:

使用某些对象槽和数据作为 args 调用 (my-test) 会导致:

所以我被困在这里。专业化有效,因为适用的方法现在包括 eql-specialized :after 方法,但不幸的是它似乎没有被调用。任何人都可以帮助我完成它并将其重构为一个可爱的小实用宏吗?

0 投票
2 回答
489 浏览

lisp - Lisp:我怎样才能在initialize-instance :around 方法中获取创建的实例

我想为一个类 X 创建一个初始化实例的 (:around 合格) 专门化器,它将首先调用下一个方法,然后调用另一个类的 make-instance,为它提供创建的 X 实例。我怎么能在 initialize-instance :around 方法中获取创建的实例?(当然假设在调用 call-next-method 之后我们处于 :around 的完成端)

编辑:A 类与 B 类通过每个插槽中的一个插槽保持另一个的 id 具有双向关系,但 A 类需要 B 类的 id,而相反则不需要。所以我想要的流程是:

  1. 生成实例'classA
  2. 在 initialize-instance :around classA 里面我会有:

    一世。make-instance classB 并获取 id-of-B。

    ii call-next-method 添加 id-of-B

    iii 将classB点对应的id-of-A slot设置为我们创建的classA实例(这是我原来提问的原因)

现在我可以在 :before 中执行 [i] 和在 :after 中执行 [iii],但我不能:A 类和 B 类是大象的持久类,我想将整个流程包装在一个我不想跨越许多方法的事务中. 对于那些熟悉大象的人,我想使用 ensure-transaction 包装器,我不想在不同的点使用显式的 begin 和 commit 函数调用。

0 投票
2 回答
297 浏览

lisp - sbcl中奇怪的类优先级列表

在 sbcl 中,

cons 继承自 list 而不是相反,这不是很奇怪吗?我在这里想念什么?

0 投票
1 回答
954 浏览

key - 使用 Common Lisp CLOS 对象作为哈希表中的键?

我想使用 Common Lisp CLOS 对象作为哈希表中的键。我认为它会像这样简单:

查看 Common Lisp Hyperspec,似乎我只能使用 eq、eql、equal 或 equalp 来测试相等性。

有什么办法可以做到这一点吗?或者这只是一件非常愚蠢的事情,这就是为什么标准不允许这样做?