问题标签 [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.
lisp - 类终结:如何避免创建虚拟实例?
我遇到了一个问题,第三方库需要对一个类进行操作,就好像它已经完成一样。经过一番阅读,我了解了这种机制背后的动机,但我真的不知道它是如何运作的。
例子:
除非我添加第一行,否则该函数将无法编译,给我这个错误:
optima
是一个模式匹配库,(expression :op op ...)
它将类的实例expression
与给定的模式匹配。我不知道很多细节,但看起来它需要知道为这个类定义的访问器是什么,而且看起来这些信息在最终确定之前是不可用的。那么,有没有办法回避最终确定的问题呢?
该课程不会被扩展(至少不会在这个项目中,也没有计划)。创建一个虚拟实例并没有那么大的伤害......这只是一个丑陋的解决方案,所以我希望找到一个更好的解决方案。另外,也许,我会得到更多关于定稿的信息,这也很好:)
common-lisp - 如何使用方法组合减少代码重复但保持可能的提前返回
我有一组代表必须处理的消息的类。但是对于处理程序来说,只有有限数量的空位。因此,处理消息对象的处理程序的任何“调度”必须首先检查是否有空闲点。
如果有 -> 调度。
如果没有 -> 不发送并返回相应的消息
由于这部分代码在任何调度方法中都是相同的,我认为最好使用方法组合工具来强制执行,但我不知道如何。
在我当前的代码库中,我尝试使用 :before 方法,但显然您不能在这种情况下使用 return:
这种方法是否合理,如果是,我该如何以有效的方式做到这一点?(我已经尝试return-from
过同样的结果)
lisp - 使用重复参数有效评估拼接列表
我想通过类的插槽名称列表重复出现,两个类的插槽名称相同((current-trial *exp*)
&(previous *exp*)
指的是同一类的实例)。在每次递归时,我想评估插槽名称,以便可以获取和设置该实例的该插槽的值。下面的代码满足了这个期望,但我担心依赖 eval 因为它很慢并且不允许词法上下文(Graham,1996)。什么是有效的并允许词汇上下文的替代表述?
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).
common-lisp - 专注于向量和矩阵
我正在使用 common-lisp 进行实时图形实验,到目前为止它非常棒。我对速度和与 cffi 轻松兼容的要求意味着我使用的是“类型化”数组。代码中真正难看的一个区域是我的矩阵和向量数学函数的通用版本。由于 CLOS 不能专注于数组的长度,我正在做这样的事情:
这有效,但感觉不对。我已经看到了各种 CL 实现的扩展,并听说了 MOP 的承诺。
我已经避开了这个,因为我担心它会破坏一些 CL 实现的功能,但我最近看到了Closer-to-Mop 项目。
核心问题: MOP 是否提供了一种更有效的方法来专门研究长度?有什么我应该关注的领域/技术吗?
inheritance - CLOS的instanceof等价?如何检查实例是否继承自另一个对象?
我可以在我的实例 b 上调用什么谓词函数,如果它是从 a 继承的,它会返回 T?在以下方面:
common-lisp - sbcl / CLOS 为什么我必须在这里添加一个“validate-superclass”-Method?
在 SBCL 中,当我定义新的元类时
并向GF“make-instance”添加一个方法:
如果我尝试创建实例,我会收到错误消息:
现在,如果我添加所需的定义:
有用:
我的问题是:为什么需要这样做?
从我的 POV 来看,将 count-class 声明为 standard-class 的派生类就足够了,就像我在第一步中所做的那样。
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 来解决我提出的问题。
lisp - 在 Lisp 中调用另一个重载方法
我不知道这是否可能,只是使用了一个(相当丑陋的)解决方法。
假设我们有一个类结构如下:
和方法:
现在,我想为 'a 调用 print,然后为 'b 调用 print,假设存在“类型转换”函数:
我的解决方法是在 b 的打印对象中创建一个类型为 a 的对象,然后调用 prin1
我尝试强制并以无限循环结束。我刚刚意识到我可以尝试使用 find-method 和 call-method(它会工作吗?)。或者我应该尝试使用 :around 的解决方案?
scheme - make-operator 返回 swindleobject
如果我编译此代码并编写(制作西装)| (制作夹克)| 使(裤子)进入解释器,返回总是#<procedure:swindleobj>
但它应该是 sth like #<jacket size=40>
。
我错过了任何要求还是我做错了什么?