Common lisp 从配置文件创建类实例的惯用方法

Common lisp 从配置文件创建类实例的惯用方法,common-lisp,idioms,clos,Common Lisp,Idioms,Clos,编辑:我重新组织了这个问题,所以(希望)更容易回答。我是CL的新手,所以当我甚至不确定最好的描述方式是什么时,有时很难描述我正在尝试做什么:P 在过去的几周里,我一直在学习一些常见的Lisp,我想知道在给定一个配置文件的情况下,创建对象实例的最佳方法,该配置文件定义了类的一些插槽值,但这些值在分配之前需要以某种形式进行规范化 举个简单的例子,如果我有以下的类: (定义我的类() ((姓名) :initarg:name :访问器名称) (十) :initarg:x :表格10 :存取器x) (y)

编辑:我重新组织了这个问题,所以(希望)更容易回答。我是CL的新手,所以当我甚至不确定最好的描述方式是什么时,有时很难描述我正在尝试做什么:P

在过去的几周里,我一直在学习一些常见的Lisp,我想知道在给定一个配置文件的情况下,创建对象实例的最佳方法,该配置文件定义了类的一些插槽值,但这些值在分配之前需要以某种形式进行规范化

举个简单的例子,如果我有以下的类:

(定义我的类()
((姓名)
:initarg:name
:访问器名称)
(十)
:initarg:x
:表格10
:存取器x)
(y)
:initarg:y
:initform nil
:存取器(y)

(defmethod初始化实例:after((obj我的类)&key)
(带插槽(x和y)
obj
(setf y(*2 x)))
我想要一种在外部文件中指定的方法,例如
instance-a.lisp

(可能是某个宏“A”
:x 5)
但在构造实例时,必须先规范化值x。最后调用
make instance
,如下所示:

(使实例成为我的类
:name(配置中的名称值)
:x(标准化(x-value-from-config))
其中
(name-value-from-config)
将是“A”,而(x-value-from-config)将是5。注意:这两种形式仅用于占位符,以指示应使用配置中的值构造它

(defparameter *instance-a*
   (make-instance 'my-class :x 5 :y '(1 2 3)))

我最初的想法是将配置文件中的任何内容转换为哈希表或具有适当键的plist。

我不清楚您真正想要做什么

为什么要使用宏来创建对象

  • 宏会产生编译时的副作用。例如,对象应该在文件编译期间可用

  • 宏提供了更方便的语法

但出于所有其他目的,不要尝试做一些聪明的事情。通常我会加载一个Lisp文件进行配置

(defparameter *instance-a*
   (make-instance 'my-class :x 5 :y '(1 2 3)))
如果需要配置该类:

(defparameter *a-class* 'my-class)

(defparameter *instance-a*
   (make-instance *a-class* :x 5 :y '(1 2 3)))

很抱歉措辞不当,我很难理解我想弄明白的内容。我试图避免这样做,因为类中会有其他内容,应该只从配置文件中进行部分初始化。显然,对于简单的示例类,您可以使用
生成实例
。我想知道他是处理这个问题的最佳方法。以asdf:defsystem为例。@mrenaud92:您需要提出一个更具体的问题才能得到答案。指向asdf没有帮助,因为它是a)一个大型软件,b)asdf是用通用Lisp编写的,特别难看,而且不是惯用的方式。ASDF中有许多基本的设计问题和错误。您可能不想重复它们。请试着描述一个特定的用例。关于你的b点),谢谢你让我知道。由于不熟悉这种语言,我真的不知道哪些项目使用的原则是“惯用的”,哪些原则只是因为有效而乱扔垃圾。您知道有哪些开源项目遵循良好的设计原则,值得探索和学习?@mrenaud92:您可以从开始。我找到了,写得也很好。