4

リーダー マクロの呼び出しを引用する方法はありますか? より具体的には、一度評価されると defclass ステートメントとそれぞれの XML ファイルを生成するマクロを作成したいと考えています。これは可能ですか?

リーダー マクロの使用を考えまし#.( ... )たが、マクロ パラメーターはリーダー マクロ内での使用に限定されていないと思います。これは正しいです?

したがって、私の 2 番目の考えは、リーダー マクロを含むステートメントを生成しようとすることでしたが、それを行う方法があるかどうかはわかりません。

マクロ呼び出しを展開する際の XML ファイルの生成に関する提案はありますか?

アイデアをお寄せいただきありがとうございます。

4

2 に答える 2

4

「リーダー マクロ」と「マクロ」はまったく異なる獣であり、非常に異なることを行うために使用されます。

「リーダーマクロ」は通常、そもそも関数です。それらは 1 文字 (または特定の 2 文字のシーケンス) にバインドされ、ソース コードの読み取り方法を変更します。それらはコードに関するものではなく、オブジェクトの作成に関するものです。

「リーダーマクロ」の場合、「マクロパラメーター」が何であるかについての明確な定義はありません(おそらく、リーダーマクロを最初に呼び出す原因となった文字のシーケンスを除いて、次の場合に役立ちます)たとえば、リストを読むときにa(と a を一致させます)。)

于 2012-11-02T09:59:09.933 に答える
1

次のようなもの:

(defmacro def-wsdl-class (name (&rest supers)
                           (&rest slots)
                           &rest options)
  `(progn
     (eval-when (:compile-toplevel :execute)
       (with-open-file (xml-file (make-pathname :name (string-capitalize name)
                                                :type "wsdl"
                                                :defaults (or *compile-pathname*
                                                              *load-pathname*))
                                 :direction :output
                                 :if-exists ,(getf options :if-wsdl-exists :error))
         (when xml-file
           (spit-xml xml-file ',name ',supers ',slots ,@options))))
    `(defclass ,name (,@supers)
       (,@slots)
       ,@(chew options)))))

編集:元の質問に答えるために、通常、リーダーマクロを(逆)引用することはできません。それらは構文が読み取られる場所で実行されます。これを読み取り時と呼びましょう。リーダー マクロは、通常のマクロ展開には関与せず、マクロ展開の前に動作します。

バッククォート リーダー マクロ内で呼び出されていることを認識して操作するリーダー マクロを作成することもできますが、バッククォート リーダー マクロの実装依存の動作を認識または変更する必要があります。

ただし、リーダー マクロからバッククォートされたフォームを返すことはできます。

于 2012-11-02T23:35:14.883 に答える