1

编辑:我已经重组了这个问题,所以它(希望)更容易回答。我是 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。

4

1 回答 1

2

我不清楚你真正想做什么。

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

  • 宏创建编译时副作用。例如,该对象应该在文件编译期间可用。

  • 宏提供了更方便的语法

但出于所有其他目的,不要试图做一些聪明的事情。通常我只LOAD需要一个 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)))
于 2013-07-04T21:05:14.307 回答