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

methods - 在 defmethod 中使用 Common Lisp 用户定义类型

我希望能够将定义的类型用作defmethod. 动机是在后期更改的可读性和灵活性。像这样的东西:

但是,这不起作用。CLtL2 说“表单 deftype 不创建任何类”。

所以我必须写:

另一种方法是定义一个名为的类foo,它只不过是一个包装器,fixnum但对于像fixnum?

有没有更好的办法?

0 投票
2 回答
61 浏览

formatting - CLOS:格式化生成实例的初始化参数列表

一段时间以来,我一直在摸不着头脑-也许有人可以阐明如何从包含(键值)子列表的嵌套列表中格式化“make-instance”的初始化参数列表。例子:

如果我在这样的列表中有关键字和值:

任何帮助和指点表示赞赏!

谢谢,马利诺

0 投票
2 回答
170 浏览

common-lisp - 此 CLOS 代码是否会导致 Common Lisp 中的运行时或编译时错误?

假设我编写了以下代码(请原谅任何错误,我是 Lisp 新手,我无法在这台机器上运行 CL)

根据我的期望,它应该打印评论中写的内容而没有任何抱怨。

如果我添加以下代码会发生什么?

如果我理解标准方法组合,适用的方法cc将被排序为(m a), (m b), (m o), 并且(m b)不会被call-next-method成功调用。但实际上会发生什么?当我定义类c并说它使泛型函数的方法链无效时,CL 会抱怨m吗?还是会出现运行时错误?

0 投票
1 回答
240 浏览

common-lisp - 自定义插槽选项不会对其参数应用任何缩减

假设我定义了一个使用验证器插槽增强标准插槽的元类,当我:validator (clavier:valid-email "The email is invalid")作为选项传递时,它不是存储表达式的结果(这是一个可调用函数),而是存储表达式本身。扩展标准插槽时我错过了一步吗?如何确保在存储之前评估表达式?我正在使用 SBCL 1.2.11 顺便说一句。这是有问题的代码

当创建实例时代码失败,因为 (CLAVIER:VALID-EMAIL "The email is invalid") 不是可调用的。

0 投票
1 回答
129 浏览

common-lisp - 使用超类构造函数?

所以我有课

和一个构造函数

有没有一种简单的方法来定义一个函数,该函数接受一个现有的FOO并产生一个定义BAR了额外插槽的C函数?即无需列出所有插槽:

0 投票
1 回答
160 浏览

common-lisp - 如何最好地保存/读取数据结构?

我想写一些由文件指向FOOBAR指向的数据结构,并将数据结构读回到符号中FOOBAR当我开始一个新的 Common Lisp 会话时。

它似乎*PRINT-READABLY*允许以一种可以读回的方式READ打印对象,并且我可以更改对象的打印方式(defmethod print-object ...)。由于应该以可接受的方式打印对象READ,因此我不必定义任何进一步的方法来重新读取对象。

但是有没有办法将每个写入的数据结构与其对应的符号联系起来,而不必依赖于数据结构的写入和读取顺序?

0 投票
3 回答
535 浏览

lisp - Common Lisp 对象系统方法执行顺序

我有以下两个课程:

这个的输出是:

我想弄清楚的是这些方法是如何按照“顺序”执行的。我似乎无法理解正在发生的事情以及原因。据说有一个规则优先级,但我不知道在哪里可以找到它。例如,为什么"Hello!Can I help you"在这种情况下不开火?

0 投票
1 回答
116 浏览

methods - common lisp 中的匿名方法

我想将通用函数保存为变量:

call-next-method但是当添加一个方法时,我必须next-method-p自己定义:

如何调用定义方法call-next-method?有没有更简单的方法来做到这一点?

0 投票
2 回答
285 浏览

common-lisp - conses 的 print-object 方法的重新定义在不同的 CL 实现中具有不同的效果

尝试不以标准列表表示法打印 conses,而是始终以点对形式打印,以最小的努力,我以这种方式重新定义了print-object该方法:

但是对于不同的实现效果是不同的。

在 Clozure CL 和 LispWorks Personal 中,结果是我所期待的:

而在 SBCL 和 AllegroCLexpress 中,列表的打印方式没有任何变化:

所以,我想知道这是否是由于语言规范中的一些歧义,如果这种行为被明确声明为未指定,如果这是由于 REPL 与包的某些交互,或者最后,如果有实现就这个定义而言是正确的,而其他的则不正确。最后要注意的是,在 SLIME 中给出这样的定义会对 SLIME 本身造成严重破坏!

有人可以阐明这些差异,并提出一种替代方法(如果存在的话,那么问题较小)来实现我的目标?

0 投票
1 回答
509 浏览

loops - 在宏上使用循环在 Common Lisp 中生成类槽

在 CLOS 上上课时,我多次遇到相同的模式:

(这是否是好的设计是我会随着时间学习的)

我试图用一个宏来解决这个问题,所以我可以打电话说:

我的第一个解决方案(暂时忽略卫生)是分成两个宏:一个用于创建每个字段,另一个用于创建类本身。

使访问器字段的宏似乎是正确的:

但我没有得到正确的主要宏。我的第一次尝试是:

但这无效,SBCL 在 defmacro 评估时给了我以下错误:

究竟发生了什么?甚至没有定义插槽时,编译器如何判断 (car slot) 的类型?如何继续正确定义此宏?