问题标签 [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 投票
1 回答
634 浏览

lisp - 类终结:如何避免创建虚拟实例?

我遇到了一个问题,第三方库需要对一个类进行操作,就好像它已经完成一样。经过一番阅读,我了解了这种机制背后的动机,但我真的不知道它是如何运作的。

例子:

除非我添加第一行,否则该函数将无法编译,给我这个错误:

optima是一个模式匹配库,(expression :op op ...)它将类的实例expression与给定的模式匹配。我不知道很多细节,但看起来它需要知道为这个类定义的访问器是什么,而且看起来这些信息在最终确定之前是不可用的。那么,有没有办法回避最终确定的问题呢?

该课程不会被扩展(至少不会在这个项目中,也没有计划)。创建一个虚拟实例并没有那么大的伤害......这只是一个丑陋的解决方案,所以我希望找到一个更好的解决方案。另外,也许,我会得到更多关于定稿的信息,这也很好:)

0 投票
2 回答
241 浏览

common-lisp - 如何使用方法组合减少代码重复但保持可能的提前返回

我有一组代表必须处理的消息的类。但是对于处理程序来说,只有有限数量的空位。因此,处理消息对象的处理程序的任何“调度”必须首先检查是否有空闲点。

如果有 -> 调度。

如果没有 -> 不发送并返回相应的消息

由于这部分代码在任何调度方法中都是相同的,我认为最好使用方法组合工具来强制执行,但我不知道如何。

在我当前的代码库中,我尝试使用 :before 方法,但显然您不能在这种情况下使用 return:

这种方法是否合理,如果是,我该如何以有效的方式做到这一点?(我已经尝试return-from过同样的结果)

0 投票
1 回答
81 浏览

lisp - 使用重复参数有效评估拼接列表

我想通过类的插槽名称列表重复出现,两个类的插槽名称相同((current-trial *exp*)(previous *exp*)指的是同一类的实例)。在每次递归时,我想评估插槽名称,以便可以获取和设置该实例的该插槽的值。下面的代码满足了这个期望,但我担心依赖 eval 因为它很慢并且不允许词法上下文(Graham,1996)。什么是有效的并允许词汇上下文的替代表述?

0 投票
4 回答
1667 浏览

common-lisp - Undefining a class and all its methods in Common Lisp

I would like to undefine a class and all of its methods but after a quite thorough search on Googlore I have been unable to find a clue about how to do this.

I am using an implementation of Commmon Lisp called CCL (Clozure CL).

0 投票
1 回答
208 浏览

common-lisp - 专注于向量和矩阵

我正在使用 common-lisp 进行实时图形实验,到目前为止它非常棒。我对速度和与 cffi 轻松兼容的要求意味着我使用的是“类型化”数组。代码中真正难看的一个区域是我的矩阵和向量数学函数的通用版本。由于 CLOS 不能专注于数组的长度,我正在做这样的事情:

这有效,但感觉不对。我已经看到了各种 CL 实现的扩展,并听说了 MOP 的承诺。

我已经避开了这个,因为我担心它会破坏一些 CL 实现的功能,但我最近看到了Closer-to-Mop 项目

核心问题: MOP 是否提供了一种更有效的方法来专门研究长度?有什么我应该关注的领域/技术吗?

0 投票
1 回答
995 浏览

inheritance - CLOS的instanceof等价?如何检查实例是否继承自另一个对象?

我可以在我的实例 b 上调用什么谓词函数,如果它是从 a 继承的,它会返回 T?在以下方面:

0 投票
1 回答
704 浏览

common-lisp - sbcl / CLOS 为什么我必须在这里添加一个“validate-superclass”-Method?

在 SBCL 中,当我定义新的元类时

并向GF“make-instance”添加一个方法:

如果我尝试创建实例,我会收到错误消息:

现在,如果我添加所需的定义:

有用:

我的问题是:为什么需要这样做?

从我的 POV 来看,将 count-class 声明为 standard-class 的派生类就足够了,就像我在第一步中所做的那样。

0 投票
3 回答
2000 浏览

common-lisp - 有没有办法访问 CLOS 中超类列表中的插槽?

有没有办法访问 CLOS 中的超类插槽?

例如,在 Objective CI 中可以执行

这会向 frob 的(唯一)超类发送消息。

仔细阅读 CLOS 文档建议DEFCLASS在类创建时合并所有超类信息,因此这种与超类通信的能力会丢失。这个对吗?

编辑:

这个场景有点不寻常:

给定的类

比如说,如何拥有一个方法,BEHAVIOR-TYPES或者GET-BEHAVIOR当使用 type 的对象调用时horse返回的方法'(:eat :sleep :drink :buck :gambol :neigh)。也就是说,通过槽继承“添加”到 initform 而不是替换它。

一个简单的解决方案是,而不是将数据分配给类,而是使用这样的通用方法:

但是,此解决方案将数据移动到defgeneric它正确所属的类而不是类中。所以这个问题的动机就来自于此。

无论如何——所提出的问题反映了对 CLOS 设计的误解。按照要求和在正常框架内执行此任务是不可能的。但是,下面给出了两种不同的方法,使用 MOP 来解决我提出的问题。

0 投票
3 回答
252 浏览

lisp - 在 Lisp 中调用另一个重载方法

我不知道这是否可能,只是使用了一个(相当丑陋的)解决方法。

假设我们有一个类结构如下:

和方法:

现在,我想为 'a 调用 print,然后为 'b 调用 print,假设存在“类型转换”函数:

我的解决方法是在 b 的打印对象中创建一个类型为 a 的对象,然后调用 prin1

我尝试强制并以无限循环结束。我刚刚意识到我可以尝试使用 find-method 和 call-method(它会工作吗?)。或者我应该尝试使用 :around 的解决方案?

0 投票
1 回答
68 浏览

scheme - make-operator 返回 swindleobject

如果我编译此代码并编写(制作西装)| (制作夹克)| 使(裤子)进入解释器,返回总是#<procedure:swindleobj>但它应该是 sth like #<jacket size=40>

我错过了任何要求还是我做错了什么?