2

elisp で resursive マクロを定義しようとしています

(defmacro remacro (keys)
  (if keys
      `(func1 ,(car keys)
            ,(remacro (cdr keys)))
      ))



(macroexpand '(remacro '(a b c)))

しかし、それはで終わります

 Lisp nesting exceeds `max-lisp-eval-depth'

エラー。

のような結果を得たかった

(func1 a (func1 b (func1 c nil nil) '(c)) '(b c))

から

(remacro '(a b c))

この定義を修正する方法を教えてください。

もう1つ、次のように「キー」を残りのパラメーターとして定義できますか

(defmacro remacro (&rest keys)
  (if keys
      `(abc ,(car keys)
            ,(remacro `,@(cdr keys)))
      ))

これを試しましたが、うまくいきません。

使用事例:

基本的に私は関数を定義したかった

alist 方式で配置されたツリー ノードを設定する

(それはまだ機能していません、それに取り組む必要があります)

(defmacro set-tree-node (tree e &rest keys)
  `(setcdr
    ,(if keys
         `(assoc (car keys)
                 (pushnew
                  (list ,(car keys))
                  (cdr
                   ,(set-tree-node `(cdr ,xtree) e `,@(cdr keys)))
                  :key 'car))
         tree)
    e))


(setq egtree nil)

走った後

(set-tree-node egtree new-node n b c)

取得する必要があります

egtree 式

((n  (b  (c . new-node))))

また

(n  (b  (c . new-node)))

私はそれを関数として定義しました

(defun set-tree-node (tree e &rest keys)
  (setcdr
   (reduce (lambda (xtree k)
             (message "tree %s k %s" xtree k)
             (assoc k (pushnew (list k) (cdr xtree) :key 'car)))
           keys :initial-value (cons nil tree))
   e))

ただし、既存のリストに対してのみ機能する可能性があります

正常に変更できます(フルパスが存在する場合はツリー)

  egtree from


  (setq egtree '((n  (b  (c . d)))))

  egtree eq


  '((n  (b  (c . replaced-d))))

このように呼び出された後

  (set-tree-node jt 'replaced-d 'n 'b 'c)

ただし、完全なパスが存在しない場合、この関数は if リストでは機能しません

4

2 に答える 2