问题标签 [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.
methods - 在 defmethod 中使用 Common Lisp 用户定义类型
我希望能够将定义的类型用作defmethod
. 动机是在后期更改的可读性和灵活性。像这样的东西:
但是,这不起作用。CLtL2 说“表单 deftype 不创建任何类”。
所以我必须写:
另一种方法是定义一个名为的类foo
,它只不过是一个包装器,fixnum
但对于像fixnum
?
有没有更好的办法?
formatting - CLOS:格式化生成实例的初始化参数列表
一段时间以来,我一直在摸不着头脑-也许有人可以阐明如何从包含(键值)子列表的嵌套列表中格式化“make-instance”的初始化参数列表。例子:
如果我在这样的列表中有关键字和值:
任何帮助和指点表示赞赏!
谢谢,马利诺
common-lisp - 此 CLOS 代码是否会导致 Common Lisp 中的运行时或编译时错误?
假设我编写了以下代码(请原谅任何错误,我是 Lisp 新手,我无法在这台机器上运行 CL)
根据我的期望,它应该打印评论中写的内容而没有任何抱怨。
如果我添加以下代码会发生什么?
如果我理解标准方法组合,适用的方法cc
将被排序为(m a)
, (m b)
, (m o)
, 并且(m b)
不会被call-next-method
成功调用。但实际上会发生什么?当我定义类c
并说它使泛型函数的方法链无效时,CL 会抱怨m
吗?还是会出现运行时错误?
common-lisp - 自定义插槽选项不会对其参数应用任何缩减
假设我定义了一个使用验证器插槽增强标准插槽的元类,当我:validator (clavier:valid-email "The email is invalid")
作为选项传递时,它不是存储表达式的结果(这是一个可调用函数),而是存储表达式本身。扩展标准插槽时我错过了一步吗?如何确保在存储之前评估表达式?我正在使用 SBCL 1.2.11 顺便说一句。这是有问题的代码
当创建实例时代码失败,因为 (CLAVIER:VALID-EMAIL "The email is invalid") 不是可调用的。
common-lisp - 使用超类构造函数?
所以我有课
和一个构造函数
有没有一种简单的方法来定义一个函数,该函数接受一个现有的FOO
并产生一个定义BAR
了额外插槽的C
函数?即无需列出所有插槽:
common-lisp - 如何最好地保存/读取数据结构?
我想写一些由文件指向FOO
和BAR
指向的数据结构,并将数据结构读回到符号中FOO
,BAR
当我开始一个新的 Common Lisp 会话时。
它似乎*PRINT-READABLY*
允许以一种可以读回的方式READ
打印对象,并且我可以更改对象的打印方式(defmethod print-object ...)
。由于应该以可接受的方式打印对象READ
,因此我不必定义任何进一步的方法来重新读取对象。
但是有没有办法将每个写入的数据结构与其对应的符号联系起来,而不必依赖于数据结构的写入和读取顺序?
lisp - Common Lisp 对象系统方法执行顺序
我有以下两个课程:
这个的输出是:
我想弄清楚的是这些方法是如何按照“顺序”执行的。我似乎无法理解正在发生的事情以及原因。据说有一个规则优先级,但我不知道在哪里可以找到它。例如,为什么"Hello!Can I help you"
在这种情况下不开火?
methods - common lisp 中的匿名方法
我想将通用函数保存为变量:
call-next-method
但是当添加一个方法时,我必须next-method-p
自己定义:
如何调用定义方法call-next-method
?有没有更简单的方法来做到这一点?
common-lisp - conses 的 print-object 方法的重新定义在不同的 CL 实现中具有不同的效果
尝试不以标准列表表示法打印 conses,而是始终以点对形式打印,以最小的努力,我以这种方式重新定义了print-object
该方法:
但是对于不同的实现效果是不同的。
在 Clozure CL 和 LispWorks Personal 中,结果是我所期待的:
而在 SBCL 和 AllegroCLexpress 中,列表的打印方式没有任何变化:
所以,我想知道这是否是由于语言规范中的一些歧义,如果这种行为被明确声明为未指定,如果这是由于 REPL 与包的某些交互,或者最后,如果有实现就这个定义而言是正确的,而其他的则不正确。最后要注意的是,在 SLIME 中给出这样的定义会对 SLIME 本身造成严重破坏!
有人可以阐明这些差异,并提出一种替代方法(如果存在的话,那么问题较小)来实现我的目标?
loops - 在宏上使用循环在 Common Lisp 中生成类槽
在 CLOS 上上课时,我多次遇到相同的模式:
(这是否是好的设计是我会随着时间学习的)
我试图用一个宏来解决这个问题,所以我可以打电话说:
我的第一个解决方案(暂时忽略卫生)是分成两个宏:一个用于创建每个字段,另一个用于创建类本身。
使访问器字段的宏似乎是正确的:
但我没有得到正确的主要宏。我的第一次尝试是:
但这无效,SBCL 在 defmacro 评估时给了我以下错误:
究竟发生了什么?甚至没有定义插槽时,编译器如何判断 (car slot) 的类型?如何继续正确定义此宏?