编辑:我已经重组了这个问题,所以它(希望)更容易回答。我是 CL 的新手,所以当我什至不确定描述它的最佳方式是什么时,有时很难描述我正在尝试做的事情:P
在过去的几周里,我一直在学习一些 Common Lisp,并且想知道在给定配置文件的情况下创建对象实例的最佳方法,该配置文件定义了类的一些插槽值,但这些值需要以某种形式进行规范化在他们被分配之前。
因此,举个简单的例子,如果我有以下课程:
(defclass my-class ()
((name
:initarg :name
:accessor name)
(x
:initarg :x
:initform 10
:accessor x)
(y
:initarg :y
:initform nil
:accessor y)))
和
(defmethod initialize-instance :after ((obj my-class) &key)
(with-slots (x y)
obj
(setf y (* 2 x))))
我想要一种在外部文件中指定的方法,比如说instance-a.lisp
(possibly-some-macro "A"
:x 5)
但是在构造实例时,必须首先以某种方式对值 x 进行归一化。最终调用make-instance
看起来像这样:
(make-instance 'my-class
:name (name-value-from-config)
:x (normalize (x-value-from-config))
其中(name-value-from-config)
“A”和 (x-value-from-config) 将是 5。 注意:这两种形式仅用于占位符,以指示应使用配置中的值构造它。
我最初的想法是将配置文件中的任何内容转换为具有适当键的哈希表或 plist。