问题标签 [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 回答
413 浏览

inheritance - 检查对象的父类

我想知道一种方法如何检查一个对象是否属于某个类,或者从它派生。例如:

或者,返回给定对象(或类)的所有基类列表的函数也将受到赞赏。

0 投票
1 回答
195 浏览

common-lisp - Common lisp CLOS 调度

有没有一种好方法可以让一个通用函数在列表的汽车上调度?

我一直在研究一个符号代数程序,目前我将大量数据存储为列表,其中包含不同的关键字作为car表示类型的 s。例如,我将单纯形存储为'(:simplex #(0 1 2)),并且我有一些我正在调用的步骤暂时存储为'(:step #(0 1 0 1))。我希望能够获取这两者的维度和边界,理想情况下使用一些内置的调度机制。

0 投票
2 回答
1205 浏览

oop - 在 Common Lisp (CLOS) 中列出对象方法

有没有办法获取为对象定义的所有方法并检查对象是否响应指定的方法?

寻找像 Ruby 的 "foo".methods 之类的东西

还有像 ruby​​ 的“foo”.respond_to 之类的东西?:方法

对于插槽slot-exists-p,有什么方法?

谢谢。

0 投票
0 回答
50 浏览

validation - CLOS:在initarg,slot-writer时强制插槽具有特定类型?

如何在 CLOS 中强制执行 slot 的类型。

我知道这(locally (declare (optimize safety))) (defclass foo () ((num :type number...可能是答案,但我认为它不够便携。(仅适用于 SBCL,不适用于 CLISP 2.49)

或者,我应该实施这些事情吗?(用于检查指定:types 之后的每个插槽。)

  1. 定义方法:after (setf SLOT)
  2. 定义方法:after initialize-instance

有没有更简单的方法来做到这一点?

而且,钩子“插槽更新”是否有任何“MOP”或元类?

谢谢。

编辑:我认为这与 CLOS 不是同一个问题:如何使插槽具有强制类型的符号向量?,因为我需要有关“元类”或slot-value-with-class事物的更多信息。

编辑:我发现closer-mop提供了更可取的便携方式。

0 投票
1 回答
300 浏览

lisp - 如何使用字符串访问未知实例的插槽?

问题

给定一个实例,以及一个包含插槽inst名称的字符串,如何获取插槽上的值?attrattrinst

当然,如果attr是符号而不是字符串,我通常只会使用(slot-value inst attr),但似乎我需要包信息才能正确调用intern(见下文)。

最小的例子

现有技术

  • 这个问题,我发现我的问题是intern在与定义类的包不同的包中创建符号。
  • 这个问题看来,我不能简单地从实例中提取包信息,所以我必须想出另一种方法(除了使用intern到达那里)

背景

我正在py-format研究 Python 格式的 Common Lisp 端口{}。为了实现 Python.运算符 ( getattr),我需要将点后面的字符串转换为点前面的对象上的一个槽。

0 投票
3 回答
661 浏览

inheritance - Diamond 继承和 Common Lisp 对象系统

我试图在 Common Lisp CLOS 中找到典型的菱形继承问题的解决方案。编码 :

还假设 C1.0、C2.1 和 C2.2 的代码位于我无权访问的库中,因此我无法在那里修改任何内容。此外,假设其他一些类也将从 C2.2 派生并且可能不想调用 m1 的 C2.2 版本,所以我不能真正使用:before. 使用call-next-method会调用C2.1版本。

只是为了澄清,这是如何在 Python 中解决它:

0 投票
1 回答
1012 浏览

performance - CLOS make-instance 真的很慢并且会导致 SBCL 中的堆耗尽

我正在用 Common Lisp(64 位 Debian GNU/Linux 中的 SBCL 1.1.5)编写一个多架构汇编器/反汇编器,目前该汇编器为 x86-64 的子集生成正确的代码。为了汇编 x86-64 汇编代码,我使用了一个哈希表,其中汇编指令助记符(字符串)例如"jc-rel8""stosb"是返回 1 个或多个编码函数列表的键,如下所示:

编码函数是这样的(虽然有些更复杂):

现在我试图通过使用转换为 Common Lisp CLOS 语法的 NASM (NASM 2.11.06)指令编码数据 (file ) 来合并完整的 x86-64 指令集。这意味着用自定义类的实例(到目前为止,一个非常基本的类,大约 20 个带,等的插槽insns.dat)替换用于发出二进制代码的常规函数​​(如上面的函数),其中将使用带参数的方法用于为给定指令(助记符)和参数发出二进制代码。转换后的指令数据看起来像这样(但它超过 40'000 行并且正好是 7193和 7193 )。x86-asm-instruction:initarg:reader:initformemitmake-instancesetf

我已经insns.dat使用一个简单的 Perl 脚本(在下面,但脚本本身没有什么有趣的内容)将 NASM 转换为 Common Lisp 语法(如上),并且原则上它可以工作。所以它可以工作,但是编译那些 7193 个对象真的很慢,并且通常会导致堆耗尽。在我的具有 16G 内存的 Linux Core i7-2760QM 笔记本电脑上,编译一个(eval-when (:compile-toplevel :load-toplevel :execute)包含 7193 个对象的代码块需要 7 分钟以上,有时会导致堆耗尽,如下所示:

我必须--dynamic-space-size 4000为 SBCL 添加参数才能完全编译它,但在分配 4 GB 的动态空间堆之后仍然有时会耗尽。即使解决了堆耗尽问题,仅在类中添加一个插槽('x86-asm-instruction用于这些实例的类)后编译 7193 个实例超过 7 分钟对于 REPL 中的交互式开发来说太多了(我使用slimv,如果这很重要) .

这是(time (compile-file输出:

使用 OOP (CLOS) 可以将指令助记符(例如jcstosb以上, :name)、指令的允许操作数 ( :operands)、指令的二进制编码 (例如#xaafor stosb, :code-string) 和指令的可能架构限制 ( :arch-flags) 合并到一个对象中。但似乎至少我用了 3 年的计算机效率不足以快速编译大约 7000 个 CLOS 对象实例。

我的问题是:有什么方法可以使 SBCLmake-instance更快,或者我应该像上面的示例那样在常规函数中保持汇编代码生成?我也很高兴知道任何其他可能的解决方案。

这是 Perl 脚本,以防万一:

0 投票
1 回答
54 浏览

common-lisp - 加载指定错误形式的文件,但收到错误

我正在尝试在(SBCL)Common Lisp 中编写一个小游戏,使用 Quickload 和 ASDF 来定义和管理依赖项。它使用 CLOS,所以我在projectcalledclasses中有一个目录,其中有一个文件locatable.cl.

LOCATABLE 类的defclass表单需要一个 LOCATOR 参数,所以我有一行:

但是,每当我尝试加载此文件或quickload系统时,都会收到上述错误(“必须为此类提供定位器参数”)。由于我试图定义一个系统而不是创建该类的任何实例,所以我不明白我为什么会得到这个。如果我注释掉错误行,一切都很好,但我被引导相信我拥有它的方式是需要:initval一个插槽的标准方式。

您如何定义这样的事情,以便您可以加载文件/进行系统定义而不实际发出错误信号?

这是课程 -

更新:我在 REPL 输入了表格并得到了同样的错误。出于好奇,我再次输入了两次,第一次使用:initform "",然后使用错误表单。它接受了第一种形式,并没有抱怨第二种形式,所以这个问题似乎不会在重新定义时发生。

0 投票
2 回答
1397 浏览

common-lisp - 在 defgeneric 中使用 :method 选项

我注意到,在阅读 Keene 的书时,它defgeneric有一个:method选项,它似乎允许您在泛型定义本身中指定一个方法。我见过的大多数文档都在单独defmethod的 s 中定义了所有适用的方法。hyperspec以其通常的清晰度列出:method作为 的选项defgeneric,但没有说明它的含义。

该选项是否:method提供默认值,或者至少记录您期望最常见的用例是什么,或者它是否具有额外的语义?作为一个风格点,如果您希望只定义一个方法,那么在表单中定义它是否更有意义defgeneric(如果您确实可以这样做),还是在defmethod? 或者在这种情况下创建一个通用函数根本没有意义,而是使用一个常规的defun

0 投票
1 回答
86 浏览

common-lisp - CLOS:将符号转换为访问器

我想这是一个真正的初学者问题,但我在这里找不到答案。我的问题:我想像这样设置一个类的插槽的值:

我为此写了一个小函数:

我在 for 循环中使用它,在其中我正在遍历 2 个列表(槽(符号列表)和值(数字列表)),并希望将实例的多个槽设置为值。

我得到的错误是:

“未定义的运算符(setf 插槽)形式为((setf 插槽)#:|Store-Var-773597|#:g773598。”

我认为问题在于我的函数中的 setf 没有使用为输入 arg 提供的值。'slot' 但读取 'slot' 作为运算符。

我尝试了不同的东西,符号函数,函数调用等,但不知道该怎么做——因为我也不太明白出了什么问题。

任何帮助将不胜感激。

谢谢,马利诺