1

編集:質問を再構築したので、(うまくいけば)答えやすくなります。私は CL を初めて使用するので、何をしようとしているのかを説明するのが難しい場合があります。

私は過去数週間にわたっていくつかの 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 になります。 注: これらの 2 つの形式は、構成からの値で構築する必要があることを示すプレースホルダーとしてのみここにあります。

私の最初の考えは、構成ファイルにあるものはすべて、適切なキーを持つハッシュ テーブルまたは 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 に答える