2

データのチャンクとルールのリストを入力として受け取り、一連の標準ルールとデータのチャンクへの入力として指定されたルールの両方を適用するプログラムがあります。両方の入力のサイズは異なる場合があります。

次のようなルールのリストを記述できるようにしたいと思います。

(rule-generating-macro
  (rule-1-name rule-1-target
    (rule-action-macro (progn actions more-actions)))
  (rule-2-name rule-2-target
    (rule-action-macro (or (action-2) (default-action))))
  ;; more rules
 )

現在、ルールはより冗長です-それらはより似ています

(defvar rule-list
  `((rule-1-name rule-1-target
      ,@(rule-action-macro (progn actions more-actions)))
    (rule-2-name rule-2-target
      ,@(rule-action-macro (or (action-2) (default-action))))
  ;; more rules
 )

後者の形式は私には見苦しいように見えますが、可変長&rest引数を処理し、それを反復処理して、変換された構造を返すことができるマクロを作成する方法を理解できません。(うまくいけば例が示すように)私のプログラムが最初にそれを見るとき、そしてあなたが制御する必要があるときにリストを評価するのではなく、ルールのリストの評価を制御しようとしているので、 aのdefun代わりに使用することは実際にはテーブルにありませんdefmacro評価、あなたはdefmacro領土にいます。この場合、厄介な点がそのrule-action-macro一部です。インタプリタにそれを読み取らせ、その拡張された値を使用させることには問題がありました。

ルールリストを簡潔に記述できるように、可変長引数を処理するマクロを作成するにはどうすればよいですか?

4

1 に答える 1

5

defmacro引数を喜んで受け入れ&restます( EmacsLispのマクロの定義とCommonLispのマクロラムダリストを参照)。

次に、マクロ本体で必要なことをほぼすべて実行できます。たとえば、繰り返し処理します。マクロは単なるバッククォート以上のものであることを忘れないでください!

例えば:

(defmacro multidefvar (&rest vars)
  (let ((forms (mapcar (lambda (var) `(defvar ,var)) vars)))
    `(progn ,@forms)))

(macroexpand '(multidefvar a b c d))
==> (PROGN (DEFVAR A) (DEFVAR B) (DEFVAR C) (DEFVAR D))
于 2013-02-12T23:32:57.197 に答える