gpt4 book ai didi

common-lisp - 如何在 Common-Lisp CLOS 中在运行时可移植地创建一个类

转载 作者:行者123 更新时间:2023-12-05 00:17:36 24 4
gpt4 key购买 nike

我需要在运行时创建一个类,可能不求助于 eval。浏览 The Common Lisp Object System MetaObject Protocol 后,得知 Common-Lisp 中元类协议(protocol)未完全标准化,我尝试了以下代码来创建一个类,实例化它,并将实例的槽值设置为一个数字:

(defparameter *my-class*
(make-instance 'standard-class
:name 'my-class
:direct-slots '((:name x :readers (get-x) :writers ((setf get-x))))))

(defparameter *my-instance* (make-instance *my-class*))

(setf (get-x *my-instance*) 42) ;; => 42

不幸的是,这段代码在 SBCL 上正常工作,但在 CCL 上却不行,在 CCL 上,类创建似乎工作,但实例创建 (make-instance *my-class*)导致以下错误:
There is no applicable method for the generic function:
#<STANDARD-GENERIC-FUNCTION INITIALIZE-INSTANCE #x30200002481F>
when called with arguments:
(#<error printing CONS #x302001A9F6A3>
[Condition of type CCL:NO-APPLICABLE-METHOD-EXISTS]

我试着看 closer-mop包,它应该隐藏元对象协议(protocol)的各种实现之间的差异,但我找不到任何对我的范围有用的函数或类。

所以问题是:有没有一种可移植的方式来创建一个类并在运行时通过直接使用 CLOS 的元类级别来实例化它?

最佳答案

CCL 似乎也要求您手动指定直接父类(super class)。

(defparameter *my-class*
(make-instance 'standard-class
:name 'my-class
:direct-slots '((:name x :readers (get-x) :writers ((setf get-x))))
:direct-superclasses (list (find-class 'standard-object))))

关于common-lisp - 如何在 Common-Lisp CLOS 中在运行时可移植地创建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39850457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com