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

时间:2013-07-04 20:19:45

标签: common-lisp idiomatic clos

编辑:我重新构建了这个问题,因此(希望)更容易回答。我是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。

1 个答案:

答案 0 :(得分: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)))